У меня есть файл фиксированной ширины, как показано ниже
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, как показано ниже:
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, чтобы указать ширину и имена столбцов для строк, чтобы схема могла применяться динамически (без жесткого кодирования) во время выполнения?