Как прочитать в файле только количество столбцов вместо разделителя строк?

#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: