В основном мой входной файл обрабатывается из файла 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') разделитель.Все три разделителя представляют только одно и то же значение Юникода.
В этих внутренних данных также доступен символ '\ n'.Размер моего файла также превышает 1 ГБ.Я пытался каким-то образом, но не могу отделиться.Нужно лучшее решение.
### 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