将数组值列转换为字符串列(包含序列化的json)

时间:2018-05-06 02:40:50

标签: json apache-spark apache-spark-sql spark-dataframe

背景

我通过首先从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")

0 个答案:

没有答案