【问题标题】:pyspark conditionally parse fixed width text filepyspark 有条件地解析固定宽度的文本文件
【发布时间】:2018-12-18 15:55:31
【问题描述】:

所以我有一个固定宽度的文件,直到其中的某个变量检查​​某个变量是“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 中执行此操作

【问题讨论】:

    标签: python apache-spark pyspark fixed-width


    【解决方案1】:

    您将编写将从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')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-22
      • 1970-01-01
      • 1970-01-01
      • 2017-04-15
      • 2010-10-25
      • 2021-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多