[英]pyspark conditionally parse fixed width text file
因此,我有一個固定寬度的文件,直到檢查其中的某個變量是“ 01”還是“ 02”,我才知道其格式。 所以我試圖創建這樣的東西:
myreport= spark.read.text("/mnt/path/mydata")
myreport= myreport.select(myreport.value.substr(1,3).alias('client'),
myreport.value.substr(4,2).alias('rptnum'),
if rptnum = '01', then
myreport.value.substr(6,2).cast('integer').alias('mo1'),
myreport.value.substr(8,2).cast('integer').alias('mo2'),
myreport.value.substr(12,2).cast('integer').alias('mo3'),
Else
myreport.value.substr(6,2).cast('integer').alias('mo1'),
myreport.value.substr(8,2).cast('integer').alias('mo2'),
myreport.value.substr(12,2).cast('integer').alias('mo3'),
myreport.value.substr(14,2).cast('integer').alias('mo4'),
myreport.value.substr(16,2).cast('integer').alias('mo5'),
myreport.value.substr(18,2).cast('integer').alias('mo6'),
基本上,如果rpt數不是01,則列數會加倍。完全不確定如何在pyspark中執行此操作
您將編寫從df.rdd.map()
調用的函數,並轉換/解析每一行。 您可以創建相同數量的列,但是在一種情況下,某些列將為空。 使用rptnum上的filter()
,可以分離出行並選擇相應的列。
from pyspark.sql.functions import *
from pyspark.sql import *
def transformRow(row):
value = row['value']
client = value[1:4]
rptnum = value[4:6]
rowDict = {'client': client, 'rptnum': rptnum,'mo1': None,'mo2': None,'mo3': None,'mo4': None,'mo5': None,'mo6': None}
rowDict['mo1'] = value[6:8]
rowDict['mo2'] = value[8:10]
rowDict['mo3'] = value[10:12]
if rptnum != '01' :
rowDict['mo4'] = value[12:14]
rowDict['mo5'] = value[14:16]
rowDict['mo6'] = value[16:18]
return Row(**rowDict)
myreport= spark.read.text("/mnt/path/mydata")
myreport = myreport.rdd.map(transformRow).toDF()
rpt1 = myreport.filter(col("rptnum") == '01').select("mo1","mo2","mo3")
rpt2 = myreport.filter(col("rptnum") != '01')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.