pyspark解析固定宽度文本文件

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

尝试解析固定宽度的文本文件。

我的文本文件如下所示,我需要行 ID、日期、字符串和整数:

00101292017you1234
00201302017 me5678

我可以使用 sc.textFile(path) 将文本文件读取到 RDD。 我可以使用解析的 RDD 和模式创建 DataFrame。 这是这两个步骤之间的解析。

python apache-spark pyspark fixed-width
5个回答
24
投票

Spark 的 substr 函数可以处理固定宽度的列,例如:

df = spark.read.text("/tmp/sample.txt")
df.select(
    df.value.substr(1,3).alias('id'),
    df.value.substr(4,8).alias('date'),
    df.value.substr(12,3).alias('string'),
    df.value.substr(15,4).cast('integer').alias('integer')
).show()

将导致:

+---+--------+------+-------+
| id|    date|string|integer|
+---+--------+------+-------+
|001|01292017|   you|   1234|
|002|01302017|    me|   5678|
+---+--------+------+-------+

有了拆分列,您可以像在普通 Spark 数据框中一样重新格式化和使用它们。


5
投票

有人问如何基于模式来做。根据以上回复,这是一个简单的例子:

x= '''    1 123121234 joe
    2 234234234jill
    3 345345345jane
    4abcde12345jack'''

schema = [
          ("id",1,5),
          ("ssn",6,10),
          ("name",16,4)
]
          
with open("personfixed.csv", "w") as f:
  f.write(x)

df = spark.read.text("personfixed.csv")
df.show()

df2 = df
for colinfo in schema:
  df2 = df2.withColumn(colinfo[0], df2.value.substr(colinfo[1],colinfo[2]))

df2.show()

这是输出:

+-------------------+
|              value|
+-------------------+
|    1 123121234 joe|
|    2 234234234jill|
|    3 345345345jane|
|    4abcde12345jack|
+-------------------+

+-------------------+-----+----------+----+
|              value|   id|       ssn|name|
+-------------------+-----+----------+----+
|    1 123121234 joe|    1| 123121234| joe|
|    2 234234234jill|    2| 234234234|jill|
|    3 345345345jane|    3| 345345345|jane|
|    4abcde12345jack|    4|abcde12345|jack|
+-------------------+-----+----------+----+

3
投票

这是给您的 Oneliner :

df = spark.read.text("/folder/file.txt")

df.select(*map(lambda x: trim(df.value.substr(col_idx[x]['idx'], col_idx[x]['len'])).alias(x), col_idx))

其中 col_idx 是这样的:

col_idx = {col1: {'idx': 1, 'len': 2}, col2: {'idx': 3, 'len': 1}}

当你有很多列时很实用,而且使用 select 比使用多个 withcolumn 更高效(参见 Spark withColumn 的隐藏成本


0
投票
df = spark.read.text("fixedwidth")

df.withColumn("id",df.value.substr(1,5)).withColumn("name",df.value.substr(6,11)).drop('value').show()

结果是

+-----+------+
|   id|  name|
+-----+------+
|23465|ramasg|
|54334|hjsgfd|
|87687|dgftre|
|45365|ghfduh|
+-----+------+

0
投票

@tzi 如果数据中没有空行,则一切正常。如果您有空行,我们如何删除它?

© www.soinside.com 2019 - 2024. All rights reserved.