我將此 json 加載到 Spark 資料幀而不指定架構:
{
"titles": {
"L": [
{
"S": "ABC"
}
]
}
}
df.printSchema() 的結果是
root
|-- titles: struct (nullable = true)
| |-- L: array (nullable = true)
| | |-- element: struct (containsNull = true)
| | | |-- S: string (nullable = true)
我嘗試將此 json 模式轉換為如下代碼,但未能成功:
AS = StructType([StructField
("L",
ArrayType(StructField("S", StringType(), True))
)
])
my_schema = StructType([
StructField("titles", AS ,True)
])
我嘗試使用 my_schema 讀取相同的 json 并得到錯誤:
“無法將 JSON 字串 '{"metadata":{},"name":"S","nullable":true,"type":"string"}' 轉換為資料型別”。
如何解決?
uj5u.com熱心網友回復:
在您定義的架構中,您缺少一個級別。
陣列的內容L應該是包含 StructField 的 StructType S。您缺少此 StructType。
正確的架構是
my_schema = StructType([
StructField("titles", StructType([
StructField("L", ArrayType(
StructType([
StructField("S", StringType(), True)
])
))
]), True)
])
uj5u.com熱心網友回復:
使用 JSON 創建資料框后,只需使用print(df.schema)以下方式列印架構:
df = spark.read.option("multiline","true").json("/content/sample_data/test.json")
print(df.schema)
[Out]:
StructType([StructField('titles', StructType([StructField('L', ArrayType(StructType([StructField('S', StringType(), True)]), True), True)]), True)])
列印的模式可以“按原樣”使用來定義模式:
from pyspark.sql.types import StructType, StructField, ArrayType, StringType, Row
schema_2 = StructType([StructField('titles', StructType([StructField('L', ArrayType(StructType([StructField('S', StringType(), True)]), True), True)]), True)])
data = [Row(Row([Row("ABC")]))]
spark.createDataFrame(data=data, schema=schema_2).schema
[Out]:
root
|-- titles: struct (nullable = true)
| |-- L: array (nullable = true)
| | |-- element: struct (containsNull = true)
| | | |-- S: string (nullable = true)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/519592.html
標籤:阿帕奇火花pyspark
上一篇:pysparkto_date轉換為無效日期回傳null
下一篇:如何將流寫入Azuredatabricks中的特定kafka集群?“60000毫秒后,元資料中不存在主題mytopic。”
