如何在Spark中通过数据框中的索引删除数组中的元素

时间:2020-10-19 19:07:54

标签: scala dataframe apache-spark

我得到了这个数据框:

[['JFK', 'John F Kennedy International', '5326', '5486'], ['ORY', 'Paris-Orly', '629', '379'], ['MAD', 'Adolfo Suarez Madrid-Barajas', '1428', '1151'], ['AMS', 'Amsterdam Schiphol', '526', '489'], ['CAI', 'Cairo International', '3779', '3584'], []]

我想删除列transArr中数组中索引0处的每个元素。 预期结果:

+------+-----------+--------------------+                                       
|NewsId|    expNews|            transArr|
+------+-----------+--------------------+
|     1|      House|[house, HH, AW1, S] |
|     1|Republicans|[republicans, R, ...|
|     1|       Fret|[fret, F, R, EH1, T]|
|     1|      About|[about, AH0, B, A...|

是否有使用Spark和Scala做到这一点的简便方法?

4 个答案:

答案 0 :(得分:2)

检查以下代码,它比slice函数要快

scala> df.show(false)
+------+-----------+---------------------+
|NewsId|expNews    |transArr             |
+------+-----------+---------------------+
|1     |House      |[house, HH, AW1, S]  |
|1     |Republicans|[republicans, R, ...]|
|1     |Fret       |[fret, F, R, EH1, T] |
|1     |About      |[about, AH0, B, A...]|
+------+-----------+---------------------+
scala> df
.withColumn(
    "modified_transArr",
    array_except(
        $"transArr",
        array($"transArr"(0))
    )
).show(false)
+------+-----------+---------------------+-----------------+
|NewsId|expNews    |transArr             |modified_transArr|
+------+-----------+---------------------+-----------------+
|1     |House      |[house, HH, AW1, S]  |[HH, AW1, S]     |
|1     |Republicans|[republicans, R, ...]|[R, ...]         |
|1     |Fret       |[fret, F, R, EH1, T] |[F, R, EH1, T]   |
|1     |About      |[about, AH0, B, A...]|[AH0, B, A...]   |
+------+-----------+---------------------+-----------------+

答案 1 :(得分:1)

对于Spark 3.0+,您可以将filter函数与其他索引参数一起使用:

df.withColumn("transArr", expr("filter(transArr, (x,i) -> i>0)"))

答案 2 :(得分:1)

Spark 2.4+解决方案:

df.withColumn("transArr", array_except($"transArr", slice($"transArr",1,1)))

slice(arr,start,len)将第一个元素作为数组返回,并使用array_except

从原始数组中减去它

答案 3 :(得分:1)

使用Spark UDF的解决方案取数组的尾部。确保处理列中的空值

    val parse_udf = udf(( value : Seq[String])=> value.tail)
df.withColumn("transArr", parse_udf($"transArr")).show()