带标题的固定宽度文件

时间:2019-04-05 00:57:55

标签: pyspark pyspark-sql

正在解析固定宽度的文件,并且遇到了一些问题。如图,我只需要删除包含列名的第一行,然后在设置每列的长度时强制转换自己的模式。

rdd = sc.textFile("file.txt")
data = rdd.filter(lambda x: not x.startswith("ID"))
schema = StructType([StructField(str(i), StringType(), True) for i in range(22)])
df = sqlContext.createDataFrame(data, schema)
df.printSchema()

root
|-- 0: string (nullable == true)
|-- 1: string (nullable == true)

当我尝试做类似的事情时:

df2 = df.select(
df.0.(1,500).alias("ID"),
df.1.(501, 510).alias("LOGS")
)

df2 = df.select(
df.value.substr(1,500).alias("ID"),
df.value.substr(501, 510).alias("LOGS")
)

它将不起作用,因为它似乎不喜欢在删除第一行后自动分配的数字列名称。通常,我会使用第二种方法来处理这些类型的解析问题,但是,使用固定宽度的文件似乎会导致我过去尝试过的任何方法出现问题。

基本上,我需要能够覆盖模式,设置所有22列的每个字段的长度,并忽略包含文件头的第一行,我不确定解决此问题的最佳方法。

1 个答案:

答案 0 :(得分:0)

您得到什么错误?我认为列名没有问题,因为您使用 str 函数将它们转换为字符串。 问题出在此代码上。

df2 = df.select(
df.value.(1,500).alias("ID"),
df.value.(501, 510).alias("LOGS")
)

要从字符串中获取字符串,请使用 substr 函数。因此,您的代码将是

df2 = df.select(
df.value.substr(1,500).alias("ID"),
df.value.substr(501, 510).alias("LOGS")
)