加载 json 文件以触发数据框

Posted

技术标签:

【中文标题】加载 json 文件以触发数据框【英文标题】:Load json file to spark dataframe 【发布时间】:2020-05-18 19:27:18 【问题描述】:

我尝试在 spark 数据框中加载以下 data.json 文件:

"positionmessage":"callsign": "PPH1", "name": 0.0, "mmsi": 100
"positionmessage":"callsign": "PPH2", "name": 0.0, "mmsi": 200
"positionmessage":"callsign": "PPH3", "name": 0.0, "mmsi": 300

通过以下代码:

from pyspark.sql import SparkSession
from pyspark.sql.types import ArrayType, StructField, StructType, StringType, IntegerType

appName = "PySpark Example - JSON file to Spark Data Frame"
master = "local"

# Create Spark session
spark = SparkSession.builder \
    .appName(appName) \
    .master(master) \
    .getOrCreate()

# Create a schema for the dataframe
schema = StructType([
    StructField('callsign', StringType(), True),
    StructField('name', StringType(), True),
    StructField('mmsi', IntegerType(), True)
])

# Create data frame
json_file_path = "data.json"
df = spark.read.json(json_file_path, schema, multiLine=True)
print(df.schema)
print(df.head(3))

它打印:[Row(callsign=None, name=None, mmsi=None)]。 我做错了什么?我已经在系统设置中设置了我的环境变量。

【问题讨论】:

好的,谢谢。我刚开始学习 pyspark 并探索与 Pandas 的相似之处/不同之处。 【参考方案1】:

您有 positionmessage 结构字段,但在 schema 中缺失。

更改schema以包含结构字段,如下所示:

schema = StructType([StructField("positionmessage",StructType([StructField('callsign', StringType(), True),
    StructField('name', StringType(), True),
    StructField('mmsi', IntegerType(), True)
]))])

spark.read.schema(schema).json("<path>").\
select("positionmessage.*").\
show()
#+--------+----+----+
#|callsign|name|mmsi|
#+--------+----+----+
#|    PPH1| 0.0| 100|
#|    PPH2| 0.0| 200|
#|    PPH3| 0.0| 300|
#+--------+----+----+

【讨论】:

当我每行有一个额外的字段时,如何加载时间戳 yyyy-mm-dd-hh:mm:ss:"timestamplast": "2019-08-01T00:00:01Z" 不确定额外字段是什么意思,您可以尝试在架构中添加字段并读取为字符串类型,然后使用 to_timestamp 函数获取所需的格式。如果这不起作用,请打开新问题并在其中标记我:) ..! 刚刚提出了一个新问题“pyspark clean data within dataframe”,更清楚我要做什么。谢谢。 ***.com/questions/61899539/…

以上是关于加载 json 文件以触发数据框的主要内容,如果未能解决你的问题,请参考以下文章

如何在加载页面时触发缓存文件?

Spark:如何解析嵌套列表的 JSON 字符串以触发数据框?

以编程方式选择索引 0(从-1)时,组合框未触发 SelectedIndexChanged

如何触发组合框项目源的重新加载

使用 sc.textFile() 加载本地文件以触发

WPF PropertyChanged 事件未触发/更新文本框