如何在Spark数据集中的字符串数组列中添加字符串

时间:2019-06-06 23:14:02

标签: java apache-spark apache-spark-sql apache-spark-2.0

我有一个“数据集(行)”,如下所示

+-----+--------------+
|val  |  history     |
+-----+--------------+
|500  |[a=456, a=500]|
|800  |[a=456, a=500]|
|784  |[a=456, a=500]|
+-----+--------------+

此处val是“字符串”,历史记录是“字符串数组”。我正在尝试将val列中的内容添加到历史列中,以便我的数据集看起来像:

+-----+---------------------+
|val  |  history            |
+-----+---------------------+
|500  |[a=456, b=500, c=500]|
|800  |[a=456, b=500, c=800]|
|784  |[a=456, b=500, c=784]|
+-----+---------------------+

这里https://stackoverflow.com/a/49685271/2316771讨论了类似的问题,但是我不知道scala,也无法创建类似的java解决方案。

请帮助我在Java中实现

2 个答案:

答案 0 :(得分:0)

我编写了一个解决方案,但不确定是否可以进一步优化

    dataset.map(row -> {
        Seq<String> seq = row.getAs("history");
        ArrayList<String> list = new ArrayList<>(JavaConversions.seqAsJavaList(seq));
        list.add("c="+row.getAs("val"));

        return RowFactory.create(row.getAs("val"),list.toArray(new String[0]));},schema);

答案 1 :(得分:0)

在Spark 2.4中(不是之前),您可以使用concat函数来合并两个数组。就您而言,您可以执行以下操作:

df.withColumn("val2", concat(lit("c="), col("val")))
  .select(concat(col("history"), array(col("val2")));

注意:我第一次使用concat来连接字符串,第二次使用concat数组。 array(col("val2"))创建一个包含一个元素的数组。