使用/ Headers修复宽度文件

问题描述 投票:0回答:1

解析固定宽度的文件并遇到了一些问题。想想,我只是删除包含列名的第一行,然后在设置每列的长度时构建我自己的模式。

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列设置每个字段的长度,并忽略包含文件头的第一行,我不确定解决这个问题的最佳方法。

pyspark pyspark-sql
1个回答
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")
)
© www.soinside.com 2019 - 2024. All rights reserved.