spark hivecontext获取与配置单元客户端选择相同的格式

bprjcwpo  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(274)

当配置单元表具有Map或数组等值时,如果在配置单元客户端中选择它,它们将显示为json,例如: {"a":1,"b":1} 或者 [1,2,2] .
在spark中选择这些对象时,它们是 DataFrame . 如果你把每一行都串起来 Map("a" -> 1, "b" -> 1) 或者 WrappedArray(1, 2, 2) .
在使用spark时,我希望使用与hive客户端相同的格式 HiveContext .
我该怎么做?

kgsdhlau

kgsdhlau1#

spark有自己的函数将复杂对象转换为json表示。
这是关于 org.apache.spark.sql.functions 软件包,它还附带 to_json 执行以下操作的函数:
将包含structtype、structtypes的arraytype、maptype或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}}|
+-----+---------------+

下面是一个类似的示例,使用数组而不是Map:

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"]}|
+-----+-------------------+

相关问题