Csv 固定宽度文件中的火花读取

Csv 固定宽度文件中的火花读取,csv,apache-spark,fixed-width,Csv,Apache Spark,Fixed Width,我是Spark的新手(不到1个月!),正在处理固定宽度的平面文件原始数据输入。我使用sqlContext读取文件,使用com.databricks.spark.csv,然后使用.withColumn根据设置的宽度对行进行子串 rawData.withColumn("ID"), trim(rawData['c0'].substr(1,8))) 我遇到的问题是最后一个字段的宽度是可变的。它有一个固定的起点,但数据的“集合”数量可变,大约20个字符宽。比如说 Row 1 A 1243 B

我是Spark的新手(不到1个月!),正在处理固定宽度的平面文件原始数据输入。我使用sqlContext读取文件,使用com.databricks.spark.csv,然后使用.withColumn根据设置的宽度对行进行子串

    rawData.withColumn("ID"), trim(rawData['c0'].substr(1,8)))
我遇到的问题是最后一个字段的宽度是可变的。它有一个固定的起点,但数据的“集合”数量可变,大约20个字符宽。比如说

Row 1  A 1243 B 42225 C 23213 
Row 2  A 12425
Row 3  A 111 B 2222 C 3 D 4 E55555
我需要最终读入这些变量字段,只需拉出可变宽度列中每个组的第一个字符,然后进行转置,以便输出如下所示:

Row 1 A
Row 1 B
Row 1 C
Row 2 A
...
Row 3 D
Row 3 E

我已经阅读了我需要的固定宽度列,但我被困在可变宽度字段

zipWithIndex和explode有助于将数据转换到每个元素的行中

sc.textFile ("csv.data").map(_.split("\\s+")).zipWithIndex.toDF("dataArray","rowId").select ($"rowId",explode($"dataArray")).show(false)

+-----+------+
|rowId|col   |
+-----+------+
|0    |A     |
|0    |1243  |
|0    |B     |
|0    |42225 |
|0    |C     |
|0    |23213 |
|1    |A     |
|1    |12425 |
|2    |A     |
|2    |111   |

zipWithIndex和explode可以帮助将数据转换为每个元素的行

sc.textFile ("csv.data").map(_.split("\\s+")).zipWithIndex.toDF("dataArray","rowId").select ($"rowId",explode($"dataArray")).show(false)

+-----+------+
|rowId|col   |
+-----+------+
|0    |A     |
|0    |1243  |
|0    |B     |
|0    |42225 |
|0    |C     |
|0    |23213 |
|1    |A     |
|1    |12425 |
|2    |A     |
|2    |111   |

你可以使用正则表达式删除数字,这样你就可以得到字母。你可以使用正则表达式删除数字,这样你就可以得到字母。