pyspark解析固定宽度的文本文件

时间:2017-01-30 20:19:11

标签: python apache-spark pyspark fixed-width

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

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

00101292017you1234
00201302017 me5678

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

4 个答案:

答案 0 :(得分:3)

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

x

将导致:

y

拆分列后,您可以重新格式化并使用它们,就像在普通的火花数据帧中一样。

答案 1 :(得分:0)

我想自动执行此过程,因为不同文件的列数会有所不同

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')

我创建了一个Python函数以基于模式文件生成此函数,但是现在当我将其附加到 df.select("my automated string").show引发错误分析异常

答案 2 :(得分: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|
+-----+------+

答案 3 :(得分:0)

有人问如何根据架构来做。根据以上回复,这里有一个简单的例子:

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|
+-------------------+-----+----------+----+