用pyspark中对应的数字替换数组中的元素

Sai*_*kat 0 python-3.x apache-spark apache-spark-sql pyspark pyspark-dataframes

我有一个如下所示的数据框:

   +----------+--------------------------------+
   | Index    |           flagArray            |
   +----------+--------------------------------+
   |    1     | ['A','S','A','E','Z','S','S']  | 
   +----------+--------------------------------+
   |    2     | ['A','Z','Z','E','Z','S','S']  |
   +--------- +--------------------------------+
Run Code Online (Sandbox Code Playgroud)

我想用其相应的数值来表示数组元素。

     A - 0
     F - 1
     S - 2
     E - 3
     Z - 4
Run Code Online (Sandbox Code Playgroud)

所以我的输出数据帧应该看起来像

   +----------+--------------------------------+--------------------------------+
   | Index    |           flagArray            |           finalArray           |
   +----------+--------------------------------+--------------------------------+
   |    1     | ['A','S','A','E','Z','S','S']  | [0, 2, 0, 3, 4, 2, 2]          | 
   +----------+--------------------------------+--------------------------------+
   |    2     | ['A','Z','Z','E','Z','S','S']  | [0, 4, 4, 3, 4, 2, 2]          |
   +--------- +--------------------------------+--------------------------------+
Run Code Online (Sandbox Code Playgroud)

我在 pyspark 中编写了一个 udf,我通过编写一些 if else 语句来实现它。有没有更好的方法来处理相同的问题。

bla*_*hop 5

对于 Spark 2.4+,您可以简单地使用transform函数来循环遍历flagArray数组的每个元素,并从您可以使用element_at以下方法从该映射创建的映射列中获取其映射值:

mappings = {"A": 0, "F": 1, "S": 2, "E": 3, "Z": 4}
mapping_col = map_from_entries(array(*[struct(lit(k), lit(v)) for k, v in mappings.items()]))

df = df.withColumn("mappings", mapping_col) \
       .withColumn("finalArray", expr(""" transform(flagArray, x -> element_at(mappings, x))""")) \
       .drop("mappings")

df.show(truncate=False)
#+-----+---------------------+---------------------+
#|Index|flagArray            |finalArray           |
#+-----+---------------------+---------------------+
#|1    |[A, S, A, E, Z, S, S]|[0, 2, 0, 3, 4, 2, 2]|
#|2    |[A, Z, Z, E, Z, S, S]|[0, 4, 4, 3, 4, 2, 2]|
#+-----+---------------------+---------------------+
Run Code Online (Sandbox Code Playgroud)