背景
我通过首先从StructType
dataset.schema()
生成叶节点/类型的映射,然后使用col.alias(...)
和{{1}来展平给定Spark DataSet的嵌套模式生成一个展平的数据集。例如:
问题
我想将它们序列化为JSON字符串,而不是透视/爆炸数组类型字段。
这种方法似乎几乎可以使用to_json函数进行数组序列化,如下面的设计示例所示:select(reAliasedCols)
。
不幸的是,对于包含基元数组的列(结构/对象数组是否正确序列化),这会失败,如下所示:
dataset.select(to_json(dataset.col("item.messages")).alias("item_messages"))
似乎org.apache.spark.sql.AnalysisException: cannot resolve 'structstojson(`item`.`messages`)'
due to data type mismatch: Input type array<string>
must be a struct, array of structs or a map or array of map.;;
不支持基元数组的序列化,仅支持“ StructType,StructTypes的ArrayType,MapTypes的MapType或ArrayType ”(尽管SPARK-21513: SQL to_json should support all column types }
示例数据集/架构:
给定字符串记录的数据集,例如:
to_json
当加载{
"item": {
"messages": [
"test",
"test2",
"test3"
]
}
}
时会生成如下的模式:
read().json(dataSetOfJsonStrings)
如何将ArrayType列转换为序列化的json?例如,这个架构:
root
|-- item: struct (nullable = true)
| |-- messages: array (nullable = true)
| | |-- element: string (containsNull = true)
可以用JSON格式写出:
root
|-- item: struct (nullable = true)
| |-- messages: string (nullable = true)
注意:示例输出未展平,只是说明了to_json()用法。
问题:
是否可以在这种转换中序列化一组基元?
我想保留任何数组类型列的结构,而不是例如,在结构中包装数组类型列只是为了允许通过{
"item": {
"messages": "[\"test\",\"test2\",\"test3\"]"
}
}
进行序列化:
to_json
产生类似这样的东西:
to_json(struct(dataset.col("item.messages"))).alias("item_messages")