我有一个要在python或pyspark中处理的数据文件,但不确定如何定义条件架构。文件的布局如下所示:
10000012345,0,2,O,20081016,0.00,200.00
10000011223,0,1,P,20190817,0,3.00,4.00
检查第四个字段,它可以具有值O或P,前三个字段在每条记录中都相同。 记录类型O和P的其余字段的数字和数据类型各不相同。
我需要类似以下内容的架构:
string field1,
string field2,
decimal field3,
string field4
if field4 == "P"
string field5,
string field6
if field4 == "O"
string field7,
decimal field8
答案 0 :(得分:1)
您的输入文件的第一个记录中有7个字段,第二个记录中有8个字段,分别位于第四位的'O'和'P'。
10000012345,0,2,O,20081016,0.00,200.00
10000011223,0,1,P,20190817,0,3.00,4.00
我认为您可以使用rdd完成期望。
df = sc.textFile(path).map(lambda x: x.split(",")) \
.map(lambda x :((x[0],x[1],x[2],x[3],x[5],x[6]) if x[3]=='O' else (x[0],x[1],x[2],x[3],x[6],x[7]))) \
.toDF(['field1','field2','field3','field4','field5','field6'])
>>> df.show()
+-----------+------+------+------+------+-------+
| field1|field2|field3|field4|field5| field6|
+-----------+------+------+------+------+-------+
|10000012345| 0| 2| O| 0.00|200.00 |
|10000011223| 0| 1| P| 3.00| 4.00|
+-----------+------+------+------+------+-------+
我不太确定要为给定位置的'O'
和'P'
字段选择哪些其他元素。由于您的期望与输入文件记录不匹配。
因此,您可以根据需要更改元素位置。
注意-
具有'O'
和'P'
的rdd元素将从第0个位置开始定位在x[3]
处。