如何只读取文件的列数而不是行分隔符?

时间:2019-04-15 12:29:52

标签: apache-spark pyspark apache-spark-sql pyspark-sql

基本上,我的输入文件是从Abinitio DML文件处理的。但是我想使用Pyspark读取该文件。在Abinitio中,它们使用列数来划分行。即使使用了行分隔符“ \ n”,但在数据内部也存在“ \ n”字符。因此,仅靠行分隔符无法读取数据。

Sample.dat John\uFFFDN\uFFFD\x01\x01\x94\n\x01\uFFFD1234\uFFFDXYZ Jole\uFFFDY\uFFFD\n\x01\uFFFD5678\uFFFDXYZ Mercy\uFFFDN\uFFFD\x01\n\x94\uFFFD9765\uFFFD\n

这是示例文件,其列分隔符为('\ uFFFD'或'\ 307'或'\ xc7')分隔符。这三个分隔符都只代表相同的unicode值。

在该内部数据中也可以使用'\ n'字符。我的文件大小也超过1GB。我尝试了一些方法,但无法分开。需要一些更好的解决方案。


### My First Try: ####
line_separator = "\n"
column_separator = u"\ufffd"

conf={'textinputformat.record.delimiter':line_separator,'encoding':'iso-8859-1'}

rdd = sc.newAPIHadoopFile('file://home/user/Sample.dat', "org.apache.hadoop.mapreduce.lib.input.TextInputFormat", "org.apache.hadoop.io.LongWritable", "org.apache.hadoop.io.Text", conf=conf).map(lambda l:l[1])

rdd_kohls=rdd.map(lambda line: line.split(column_separator) )

rdd_kohls.count()

### Second Try: ####
df = spark.sparkContext.binaryFiles('file://home/user/Sample.dat', 10)

rdd = df.map(lambda x: x[1]).flatMap(lambda s: s.split(line_separator))

rdd_kohls = rdd.map(lambda s: s.split(column_separator))

rdd_kohls.count()

预期结果: Col1 Col1 Col2 Col3 Col4 John N \x01\x01\x94\n\x01 1234 XYZ Jole Y \n\x01 5678 XYZ Mercy N \x01\n\x94 9765 \n

1 个答案:

答案 0 :(得分:0)