java - Apache Spark Row 将多个字符串字段转换为单个行,并使用字符串数组转换异常

标签 java apache-spark apache-spark-sql

我尝试实现这样的代码:

    StructType dataStruct = new StructType()
            .add("items", DataTypes.createArrayType(DataTypes.StringType, false), false);
    ExpressionEncoder<Row> encoder = RowEncoder.apply(dataStruct);

    Dataset<Row> arrayItems = transactions.map((MapFunction<Row, Row>) row -> {
        List<String> items = new LinkedList<>();
        for (int i = 1; i <= 12; i++) {
            if (row.getString(i) != null)
                items.add(row.getString(i));
        }
        System.out.println(items);
        return RowFactory.create(items.toArray());
    }, encoder);

使用这种模式转换数据集:

|user<String>|item1<String>|item2<String>|item3<String>|...|item12<String>|

具有此类架构的数据集:

|item<String[]>|

但我遇到以下异常:java.lang.RuntimeException:java.lang.String不是数组架构的有效外部类型

我不明白为什么 RowFactory 采用 String 作为参数,而不是 String[]?有人可以帮助我吗,在这种情况下我应该做什么?

数据示例:

user|item1|item2|item3|item4|item5|item6|item7|item8|item9|item10|item11|item12
Bob|01W|01J|01W|01J|01W|01J|01W|01J|01W|01J|null|null
John|03T|018T|003H|A44I|03T|null|003H|A44I|03T|018T|003H|null
Bill|CMZI|UDAG|01W|null|null|01J|018T|003H|A44I|018T|003H|A44I

最佳答案

发生这种情况是因为 Java 中的可变参数只是语法糖

Object ... values

相当于

Object[] values

所以

return RowFactory.create(items.toArray());

将扩展数组。您需要一个嵌套结构:

Object[] rowItems =  {items.toArray()};
RowFactory.create(rowItems));

进一步阅读Can I pass an array as arguments to a method with variable arguments in Java?

关于java - Apache Spark Row 将多个字符串字段转换为单个行,并使用字符串数组转换异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48440869/

相关文章:

java - 没有双变量的相同代码

java - JDK9 : An illegal reflective access operation has occurred. org.python.core.PySystemState

python - Databricks - pyspark.pandas.Dataframe.to_excel 无法识别 abfss 协议(protocol)

scala - 调用distinct 和map 会在spark 库中抛出NPE

apache-spark - PySpark - 从另一列传递一个值作为 spark 函数的参数

java - Java注解处理的弊端?

java - spring boot,默认身份验证失败处理程序如何工作

scala - 使用 apache Ignite 共享 sparkRDD

scala - 如何从 array<struct> 中找到 "lowest"元素?

python - 在pyspark中将时间戳转换为纪元毫秒