固定宽度文件中的 Spark 读取
Spark reading in fixed width file
我是 Spark 的新手(不到 1 个月!)并且正在使用固定宽度的平面文件原始数据输入。我正在使用 sqlContext 使用 com.databricks.spark.csv 读取文件,然后使用 .withColumn 根据设置的宽度对行进行子字符串化。
rawData.withColumn("ID"), trim(rawData['c0'].substr(1,8)))
我遇到的问题是最后一个字段的宽度可变。它有一个固定的起点,但可变数量的 'sets' 数据,大约 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 |
我是 Spark 的新手(不到 1 个月!)并且正在使用固定宽度的平面文件原始数据输入。我正在使用 sqlContext 使用 com.databricks.spark.csv 读取文件,然后使用 .withColumn 根据设置的宽度对行进行子字符串化。
rawData.withColumn("ID"), trim(rawData['c0'].substr(1,8)))
我遇到的问题是最后一个字段的宽度可变。它有一个固定的起点,但可变数量的 'sets' 数据,大约 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 |