基本上,我的输入文件是从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
答案 0 :(得分:0)