簡體   English   中英

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

[英]pyspark parse fixed width text file

試圖解析固定寬度的文本文件。

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

00101292017you1234
00201302017 me5678

我可以使用 sc.textFile(path) 將文本文件讀取到 RDD。 我可以使用解析后的 RDD 和模式 createDataFrame。 這是這兩個步驟之間的解析。

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數據幀的格式重新格式化並使用它們。

有人問如何根據模式來做到這一點。 根據上面的回答,這里是一個簡單的例子:

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

我想自動執行此過程,因為不同文件的列數會有所不同

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它引發了錯誤分析異常

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM