我得到了这个数据框:
[['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做到这一点的简便方法?
答案 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()