如何从同时列出数据和模式的 JSON 文件创建 Spark-SQL 数据框

Posted

技术标签:

【中文标题】如何从同时列出数据和模式的 JSON 文件创建 Spark-SQL 数据框【英文标题】:How to create a Spark-SQL dataframe from JSON file where data and schema are both listed 【发布时间】:2020-08-05 12:53:03 【问题描述】:
conf = SparkConf().setAppName("PySpark").setMaster("local")
sc = SparkContext(conf=conf)
sqlContext = SQLContext(sc)

file = sqlContext.read.json(json_file_path)
file.show()

输出:

+--------------------+--------------------+
|                data|              schema|
+--------------------+--------------------+
|[[The battery is ...|[[[index, integer...|
+--------------------+--------------------+

如何使用自己创建的架构提取数据。我的架构代码是:

from pyspark.sql.types import ArrayType, StructField, StructType, StringType, IntegerType
schema = StructType([
    StructField('index', IntegerType(), True),
    StructField('content', StringType(), True),
    StructField('label', IntegerType(), True),
    StructField('label_1', StringType(), True ),
    StructField('label_2', StringType(), True ),
    StructField('label_3', IntegerType(), True ),
    StructField('label_4', IntegerType(), True )])

我试过了:

file.withColumn("data", from_json("data", schema))\
    .show()

但我收到以下错误:

 cannot resolve 'from_json(`data`)' due to data type mismatch: argument 1 requires string type, however, '`data`' is of array<struct<content:string,index:bigint,label:bigint,label_1:string,label_2:string,label_3:double,label_4:timestamp>> type.;;

【问题讨论】:

你能把正确的样本数据输入输出吗? 【参考方案1】:

read 方法已经识别了后面的架构。

尝试运行file.printSchema(),它应该会显示更多-更少您想要的架构。

data的解包方式是运行:

file = file.select(explode("data").as("exploded_data"))

如果您愿意,您可以通过以下方式将其提升到一个新的水平:

file.select(file.col("exploded_data.*"))

这将使架构变平。

免责声明:这是 scala 代码,python 可能需要微调

【讨论】:

是的。它确实需要一些调整以适应 Python:file.select(F.explode(file.data).alias('file')).select('file.*') 很高兴它成功了!如果对您有帮助,请不要忘记接受答案。 :) 知道了!再次感谢

以上是关于如何从同时列出数据和模式的 JSON 文件创建 Spark-SQL 数据框的主要内容,如果未能解决你的问题,请参考以下文章

如何从 XSD 创建 BQ 模式

Flutter 如何从 JSON 中列出具有多个子项的数组

如何从 Json schem 文件创建 DataFrame Schema

从json模式构建spark模式

从架构中删除能力视图/列出所有表

如何从邮递员集合创建 JSON 文件