如何在Spark 2.3

时间:2019-02-09 19:23:27

标签: apache-spark-sql

如何将一项附加到数据框(spark 2.3)中的数组?

这是一个整数示例,但实际情况是struct。

输入:

+------+-------------+
|   key|     my_arr  |
+------+-------------+
|5     |[3,14]       |
|3     |[9,5.99]     |
+------+-------------+

输出:

+-------------+
|     my_arr  |
+-------------+
|[3,14,5]     |
|[9,5.99,3]   |
+-------------+

3 个答案:

答案 0 :(得分:1)

您必须创建udf来添加元素,整数很容易,但struct更容易  复杂。

带有整数的代码是:

`

for x in range(100):
    if x%4 == 0:
        print(x)
        break

`

使用struct de code是:

`

 val udfConcat = udf((key:Int,my_arr:WrappedArray[Int])=> my_arr:+key)
     df.withColumn("my_arr",udfConcat(col("key"), col("my_arr"))).drop("key").show()

`

创建udf时,必须传递Array的de schema,在此示例中为具有名称和年龄的元素数组。

答案 1 :(得分:0)

这是使用Struct的另一种方式:

输入:

df.show()
+---+--------+
|Key|My_Array|
+---+--------+
|  5|  [3,14]|
|  3|  [9,45]|
+---+--------+

df.withColumn("My_Array", struct($"My_Array.*", $"Key")).show(false)

输出:

+---+--------+
|Key|My_Array|
+---+--------+
|5  |[3,14,5]|
|3  |[9,45,3]|
+---+--------+  

答案 2 :(得分:0)

没有UDF的解决方案-PYSPARK

我正面临类似的问题,并且由于性能下降,我绝对不想使用UDF

spark_df.show(3,False)

    +---+-----------+
    |key|myarr      |
    +---+-----------+
    |5  |[3.0, 14.0]|
    |3  |[9.0, 5.99]|
    +---+-----------+

输出:

spark_df=spark_df.\
        withColumn("myarr",F.split(F.concat(F.concat_ws(",",F.col("myarr")),F.lit(",") ,F.col("key")),",\s*" ) )

spark_df.select("myarr").show(3,False)


    +------------+
    |myarr       |
    +------------+
    |[3.0,14.0,5]|
    |[9.0,5.99,3]|
    +------------+

方法步骤:

  1. 首先使用 concat_ws <<将 Array 列转换为 String / strong>方法
  2. 使用 concat 函数将所需的列(“键”)与原始列(“ myarr”)合并
  3. 使用 split 函数将上一步中的 string 列转换回 Array

希望这会有所帮助。