Pyspark:使用结构列从 JSON 文件写入 CSV
Pyspark: Write CSV from JSON file with struct column
我正在读取一个包含以下结构的 .json 文件,我需要用列形式的数据生成一个 csv,我知道我不能直接写一个数组类型csv 中的对象,我使用 explode 函数删除我需要的字段,能够以柱状形式保留它们,但是在 csv 中写入数据框时,我在使用 explode 函数时遇到错误,从什么我知道不可能用同一个 select 中的两个变量来做到这一点,有人可以帮我做一些替代的事情吗?
from pyspark.sql.functions import col, explode
from pyspark.sql import SparkSession
spark = (SparkSession.builder
.master("local[1]")
.appName("sample")
.getOrCreate())
df = (spark.read.option("multiline", "true")
.json("data/origin/crops.json"))
df2 = (explode('history').alias('history'), explode('trial').alias('trial'))
.select('history.started_at', 'history.finished_at', col('id'), trial.is_trial, trial.ws10_max))
(df2.write.format('com.databricks.spark.csv')
.mode('overwrite')
.option("header","true")
.save('data/output/'))
root
|-- history: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- finished_at: string (nullable = true)
| | |-- started_at: string (nullable = true)
|-- id: long (nullable = true)
|-- trial: struct (nullable = true)
| |-- is_trial: boolean (nullable = true)
| |-- ws10_max: double (nullable = true)
我正在尝试 return 这样的事情
started_at
finished_at
is_trial
ws10_max
First
row
row
Second
row
row
谢谢!
在数组上使用 explode,在结构上使用 select("struct.*")。
df.select("trial", "id", explode('history').alias('history')),
.select('id', 'history.*', 'trial.*'))
我正在读取一个包含以下结构的 .json 文件,我需要用列形式的数据生成一个 csv,我知道我不能直接写一个数组类型csv 中的对象,我使用 explode 函数删除我需要的字段,能够以柱状形式保留它们,但是在 csv 中写入数据框时,我在使用 explode 函数时遇到错误,从什么我知道不可能用同一个 select 中的两个变量来做到这一点,有人可以帮我做一些替代的事情吗?
from pyspark.sql.functions import col, explode
from pyspark.sql import SparkSession
spark = (SparkSession.builder
.master("local[1]")
.appName("sample")
.getOrCreate())
df = (spark.read.option("multiline", "true")
.json("data/origin/crops.json"))
df2 = (explode('history').alias('history'), explode('trial').alias('trial'))
.select('history.started_at', 'history.finished_at', col('id'), trial.is_trial, trial.ws10_max))
(df2.write.format('com.databricks.spark.csv')
.mode('overwrite')
.option("header","true")
.save('data/output/'))
root
|-- history: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- finished_at: string (nullable = true)
| | |-- started_at: string (nullable = true)
|-- id: long (nullable = true)
|-- trial: struct (nullable = true)
| |-- is_trial: boolean (nullable = true)
| |-- ws10_max: double (nullable = true)
我正在尝试 return 这样的事情
started_at | finished_at | is_trial | ws10_max |
---|---|---|---|
First | row | row | |
Second | row | row |
谢谢!
在数组上使用 explode,在结构上使用 select("struct.*")。
df.select("trial", "id", explode('history').alias('history')),
.select('id', 'history.*', 'trial.*'))