我尝试实现这样的代码:
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/