Spark HiveContext与hive客户端选择具有相同的格式

时间:2018-07-20 12:06:09

标签: apache-spark hive

当Hive表具有映射或数组之类的值时,如果您在Hive客户端中选择它,它们将显示为JSON,例如:{"a":1,"b":1}[1,2,2]

在Spark中选择这些对象时,它们是DataFrame中的地图/数组对象。如果将每一行都进行字符串化,则它们是Map("a" -> 1, "b" -> 1)WrappedArray(1, 2, 2)

在使用Spark的HiveContext时,我希望与Hive客户端具有相同的格式。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

Spark具有自己的功能,可以将复杂的对象转换为其JSON表示形式。

Hereorg.apache.spark.sql.functions软件包的文档,该软件包还带有to_json函数,该函数执行以下操作:

  

将包含StructType,StructTypes的ArrayType,MapTypes的MapType或ArrayType的列转换为具有指定架构的JSON字符串。如果类型不受支持,则会引发异常。

这是在spark-shell上运行的简短示例:

scala> val df = spark.createDataFrame(
     |   Seq(("hello", Map("a" -> 1)), ("world", Map("b" -> 2)))
     | ).toDF("name", "map")
df: org.apache.spark.sql.DataFrame = [name: string, map: map<string,int>]

scala> df.show
+-----+-----------+
| name|        map|
+-----+-----------+
|hello|Map(a -> 1)|
|world|Map(b -> 2)|
+-----+-----------+

scala> df.select($"name", to_json(struct($"map")) as "json").show
+-----+---------------+
| name|           json|
+-----+---------------+
|hello|{"map":{"a":1}}|
|world|{"map":{"b":2}}|
+-----+---------------+

这是一个类似的示例,使用数组而不是映射:

scala> val df = spark.createDataFrame(
     |   Seq(("hello", Seq("a", "b")), ("world", Seq("c", "d")))
     | ).toDF("name", "array")
df: org.apache.spark.sql.DataFrame = [name: string, array: array<string>]

scala> df.select($"name", to_json(struct($"array")) as "json").show
+-----+-------------------+
| name|               json|
+-----+-------------------+
|hello|{"array":["a","b"]}|
|world|{"array":["c","d"]}|
+-----+-------------------+