apache spark从arraytype列中删除元素

时间:2018-02-07 14:03:17

标签: apache-spark apache-spark-sql

我有一个包含两列的CSV文件:

+-----+--------------------------------------------------+
|  c1 |    location                                      |
+-----+--------------------------------------------------+
|  1  |[1,2,3,4,5,6,7,8]                                 |
+-----+--------------------------------------------------+

我正在使用Spark来使用

加载此CSV文件
DataSet<Row> dataset = spark.read.format("csv").csv(pathOfCsvFile);

有没有办法从导入的列位置删除1,2,3等元素列表,结果是:

{
  "c1" : "1" ,
  "location" : {
               [4,5,6,7,8]
             }
}

1 个答案:

答案 0 :(得分:0)

您可以创建一个UDF来为您执行此操作。

假设您要删除的元素列表如下:

val ys = Seq(1,2,3)

并输入dataframe:

+---+------------------------+
|a  |b                       |
+---+------------------------+
|1  |[1, 2, 3, 4, 5, 6, 7, 8]|
+---+------------------------+

您需要从序列b

中出现的列ys中删除元素
val filterList = udf( (xs: Seq[Int], ys: Seq[Int]) => xs.filterNot(ys.contains(_) ) )

然后,在您的数据框架上调用它,如:

df.withColumn("location" , filterList($"location" , array(b.map(lit _) :_* ) )).show(false)

+---+---------------+
|a  |location       |
+---+---------------+
|1  |[4, 5, 6, 7, 8]|
+---+---------------+