簡體   English   中英

Spark HiveContext獲得與Hive客戶端選擇相同的格式

[英]Spark HiveContext get the same format as hive client select

當Hive表具有諸如映射或數組的值時,如果您在Hive客戶端中選擇它,它們將顯示為JSON,例如: {"a":1,"b":1}[1,2,2]

當您在Spark中選擇那些對象時,它們是DataFrame中的map / array對象。 如果對每一行進行字符串化,則它們是Map("a" -> 1, "b" -> 1)WrappedArray(1, 2, 2)

使用Spark的HiveContext時,我希望與Hive客戶端具有相同的格式。

我怎樣才能做到這一點?

Spark具有自己的功能,可以將復雜的對象轉換為其JSON表示形式。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM