我正在嘗試為以下資料創建架構:
[{"a": "6"},{"b":"7"}]
到目前為止我的代碼
val data = Seq("""[{"a": "6"},{"b":"7"}]""").toDF()
val schema = StructType(Seq(
StructField("colA", StructType(
Seq(StructField("a", StringType, true))
), true),
StructField("colB", StructType(
Seq(StructField("b", StringType, true))
), true)
))
val res = data.withColumn("res", from_json(col("value"), schema))
當我這樣做時res.show()
,它會回傳null
。有什么想法嗎?
uj5u.com熱心網友回復:
您得到空值,因為提供的架構不適合資料。
對于您的資料,您可以很好地創建地圖陣列的架構:
val res = data.withColumn("res", from_json($"value", ArrayType(MapType(StringType,StringType))))
res.show()
// -------------------- --------------------
// | value| res|
// -------------------- --------------------
// |[{"a": "6"},{"b":...|[{a -> 6}, {b -> 7}]|
// -------------------- --------------------
我不認為你可以用這些資料創建一個結構陣列。如果您在陣列中只有一個具有不同鍵的字典或兩個具有相同鍵的字典,則可以。但是現在你有 2 個字典,它們都有不同的鍵。陣列只能存盤一種資料型別。由于您有 2 個不同的字典,這將需要在陣列中定義不同的結構,這是不可能的,陣列只能保存一種資料型別。
我能想到的最好的方法是創建一個結構陣列,但兩個結構都有兩個欄位(a 和 b)。但是其中一個在兩個結構中都將為空。
val res = data.withColumn("res", from_json($"value",ArrayType(StructType(Seq(StructField("a",StringType,true),StructField("b",StringType,true))))))
res.show(truncate=false)
// ---------------------- ----------------------
// |value |res |
// ---------------------- ----------------------
// |[{"a": "6"},{"b":"7"}]|[{6, null}, {null, 7}]|
// ---------------------- ----------------------
uj5u.com熱心網友回復:
默認情況下,JSON 資料源可以使用默認inferschema
選項從輸入檔案推斷架構。因此,如果您將 json 存盤在檔案中,則無需自己定義:
val df = spark.read.json("<PATH_to_JSON_File>", multiLine = "true")
multiLine = "true"
僅當您的 json 記錄跨越多行時才需要使用。例子:
//read json file into dataframe
val df = spark.read.json("src/main/resources/myJsonFile.json")
df.printSchema()
df.show(false)
您仍然可以自己定義架構,但請注意您的陣列并不一致。里面的鍵有不同的名字,但它們也是不同的元素。您不能在 json 的封閉陣列中定義具有不同鍵的 2 個元素。這就像定義 2 個不同型別的元素。
所以我認為你的 json 應該是這樣的:":[{"a":"6","b":7}]"
在這種情況下,你的模式應該是:
val schema = ArrayType(StructType(Array(
(StructField("a", StringType, true),
(StructField("b", StringType, true)
)), false)
該false
欄位意味著您的陣列不能接受null
元素,但仍然可以放入null
列中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/498441.html
上一篇:Spark/Scala-在執行withColumn操作時加入結果集給出型別不匹配錯誤;發現:org.apache.spark.sql.Columnrequired:Boolean