我有一个大的非结构化数据文件,在将所有内容放入Spark数据帧之前,需要进行一些清理。例如,我有一个如下数据文件:
garbage line
garbage line
headers below
name
age
gender
headers above
garbage line
data below
ben,23,male
april,18,female
chris,26,male
data above
此文件包含文件元数据和实际数据行。如果要使用Python,我将获得headers below
,headers above
,data below
,data above
的行索引,然后对行列表进行切片以获取标头和数据行为了建立大熊猫。在Pyspark中执行此操作的好方法是什么?到目前为止,我得到的是下面的代码,想知道是否有更简单的方法。
from pyspark import SparkContext
from pyspark.sql import SparkSession
sc = SparkContext()
spark = SparkSession(sc)
rdd = sc.textFile('some_unstrutured_data.txt')
indicators = ['headers below', 'headers above', 'data below', 'data above']
row_pointers = rdd.zipWithIndex().filter(lambda r: r[0] in indicators).map(lambda r: r[1]).collect()
header_start, header_end, data_start, data_end = row_pointers[0], row_pointers[1], row_pointers[2], row_pointers[3]
headers = rdd.zipWithIndex().filter(lambda r: header_start < r[1] < header_end).map(lambda r: r[0]).collect()
data = rdd.zipWithIndex().filter(lambda r: data_start < r[1] < data_end).map(lambda r: tuple(r[0].split('|')))
df = data.toDF(headers)