【发布时间】:2018-12-17 14:57:28
【问题描述】:
我有如下固定宽度的文件
00120181120xyz12341
00220180203abc56792
00320181203pqr25483
以及指定架构的相应JSON文件:
{"Column":"id","From":"1","To":"3"}
{"Column":"date","From":"4","To":"8"}
{"Column":"name","From":"12","To":"3"}
{"Column":"salary","From":"15","To":"5"}
我使用以下方法将架构文件读入 DataFrame:
SchemaFile = spark.read\
.format("json")\
.option("header","true")\
.json('C:\Temp\schemaFile\schema.json')
SchemaFile.show()
#+------+----+---+
#|Column|From| To|
#+------+----+---+
#| id| 1| 3|
#| date| 4| 8|
#| name| 12| 3|
#|salary| 15| 5|
#+------+----+---+
同样,我将固定宽度文件解析为 pyspark DataFrame,如下所示:
File = spark.read\
.format("csv")\
.option("header","false")\
.load("C:\Temp\samplefile.txt")
File.show()
#+-------------------+
#| _c0|
#+-------------------+
#|00120181120xyz12341|
#|00220180203abc56792|
#|00320181203pqr25483|
#+-------------------+
我显然可以硬编码每列的位置和长度的值以获得所需的输出:
from pyspark.sql.functions import substring
data = File.select(
substring(File._c0,1,3).alias('id'),
substring(File._c0,4,8).alias('date'),
substring(File._c0,12,3).alias('name'),
substring(File._c0,15,5).alias('salary')
)
data.show()
#+---+--------+----+------+
#| id| date|name|salary|
#+---+--------+----+------+
#|001|20181120| xyz| 12341|
#|002|20180203| abc| 56792|
#|003|20181203| pqr| 25483|
#+---+--------+----+------+
但是如何使用SchemaFile DataFrame 来指定行的宽度和列名,以便在运行时动态应用架构(无需硬编码)?
【问题讨论】:
-
您有什么顾虑?你试过什么?
-
我想在数据上应用模式,同时作为运行时读取。非硬编码
标签: python apache-spark pyspark pyspark-sql