Background
我通过首先从 StructType
从 dataset.schema()
生成叶节点/类型的映射,然后使用 col.alias(...)
和 select(reAliasedCols)
生成展平数据集来展平给定Spark DataSet的嵌套模式 . 例如:
Issue
我想将它们序列化为JSON字符串,而不是旋转/爆炸数组类型字段 .
这种方法似乎几乎可以使用to_json函数进行数组序列化,如下面的设计示例所示: 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.;;
看来 to_json
不支持基元数组的序列化,仅支持“StructType,StructTypes的ArrayType,MapTypes的MapType或ArrayType”(尽管SPARK-21513: SQL to_json should support all column types
Example datasets/schemas:
给定字符串记录的数据集,例如:
{
"item": {
"messages": [
"test",
"test2",
"test3"
]
}
}
哪个加载 read().json(dataSetOfJsonStrings)
会产生如下模式:
root
|-- item: struct (nullable = true)
| |-- messages: array (nullable = true)
| | |-- element: string (containsNull = true)
如何将ArrayType列转换为序列化的json?例如,这个架构:
root
|-- item: struct (nullable = true)
| |-- messages: string (nullable = true)
哪些可能以JSON格式写出:
{
"item": {
"messages": "[\"test\",\"test2\",\"test3\"]"
}
}
注意:示例输出未展平,只是说明了to_json()用法 .
Question:
是否有可能在这种转换中序列化一组基元?
我想保留任何数组类型列的结构,而不是例如,在结构中包装数组类型列只是为了允许通过 to_json
进行序列化:
to_json(struct(dataset.col("item.messages"))).alias("item_messages")
产生这样的东西:
{
"item": {
"messages": "{ \"messages\": [\"test\",\"test2\",\"test3\"] }"
}
}