#apache-spark #pyspark #apache-spark-sql #pyspark-sql
#apache-spark #pyspark #apache-spark-sql
Вопрос:
В основном мой входной файл обрабатывается из файла Abinitio DML. Но я хочу прочитать этот файл с помощью Pyspark. В Abinitio они разделяются строками по количеству столбцов. Несмотря на то, что они используют разделитель строк ‘ n’, но внутри данных также присутствует символ ‘ n’. Поэтому я не могу прочитать данные только с разделителем строк.
Sample.dat
JohnuFFFDNuFFFDx01x01x94nx01uFFFD1234uFFFDXYZ
JoleuFFFDYuFFFDnx01uFFFD5678uFFFDXYZ
MercyuFFFDNuFFFDx01nx94uFFFD9765uFFFDn
Это пример файла с разделителем столбцов (‘ 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 x01x01x94nx01 1234 XYZ
Jole Y nx01 5678 XYZ
Mercy N x01nx94 9765 n
Комментарии:
1. Создайте внешнюю таблицу, используя
regex serde
шаблон, к которому затем можно легко получить доступ с помощью spark.
Ответ №1:
Это какая-то полная помощь..
https://www.ae.be/blog-en/ingesting-data-spark-using-custom-hadoop-fileinputformat/