Background

我通过首先从 StructTypedataset.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\"] }"
  }
}