Python Spark - экранирование кавычек в файле партера - PullRequest
0 голосов
/ 25 сентября 2018

Файл моего паркета получен из CSV, в котором некоторые ячейки экранированы.Например: это значение

"a , ""Hello"" c"

Я хочу, чтобы паркет считывал его как

a , "Hello" c

Я пытаюсь экранировать кавычки из файла паркета во время чтения.Если бы я читал CSV, я мог бы сделать это следующим образом

df = spark.read.option('quote', '"').
                 option('escape', '"').csv("./temp.csv")

Однако у нас нет аналогичных вещей для паркетных файлов.Я читал паркет как с использованием параметров, так и без параметров

>>> dfP = spark.read.parquet("./temp.parquet")
>>> dfP.show()
+---+---+---+----------------+---+
|_c0|_c1|_c2|             _c3|_c4|
+---+---+---+----------------+---+
|  A|  B|  C|               D|  E|
|  1|  2|3,4|"a, ""HEllo"" c"|  5|
+---+---+---+----------------+---+

>>> dfP = spark.read.option('quote', '"').
      option('escape', '"').parquet("./temp.parquet")
>>> dfP.show()
+---+---+---+----------------+---+
|_c0|_c1|_c2|             _c3|_c4|
+---+---+---+----------------+---+
|  A|  B|  C|               D|  E|
|  1|  2|3,4|"a, ""HEllo"" c"|  5|
+---+---+---+----------------+---+

Я хочу, чтобы столбец D читался как 'a, "Hello" c'.Есть ли способ заставить его работать?

Входной паркет конвертируется из файла CSV, который является

A,B,C,D,E
1,2,"3,4","a, ""HEllo"" c",5

РЕДАКТИРОВАТЬ: Паркет уже создан.Я не могу изменить способ создания паркета.Я должен использовать паркет, который у меня есть, и попытаться сбежать.

1 Ответ

0 голосов
/ 25 сентября 2018

Насколько я знаю, есть только одна опция для паркетных файлов.И это для сжатия.Другие параметры, такие как «цитата», «разделитель», «escape», предназначены для файлов CSV.Таким образом, они не работают для паркетных файлов.

Я пытался смоделировать ваш случай, и я думаю, что лучшим решением для этого случая является использование функций.Сначала я создал файл csv и поместил его в HDFS

[ali@aliyesilli ~]$ hadoop fs -cat /test/exCsv/test.csv
A,B,C,D,E
1,2,"3,4","a, ""HEllo"" c",5

Затем я прочитал его как файл csv и снова сохранил его как файл паркета

>>> df = spark.read.csv('hdfs://localhost:8020/test/exCsv',header=True)
>>> df.show()
+---+---+---+----------------+---+
|  A|  B|  C|               D|  E|
+---+---+---+----------------+---+
|  1|  2|3,4|"a, ""HEllo"" c"|  5|
+---+---+---+----------------+---+

>>> df.write.parquet('hdfs://localhost:8020/test/exPar')

Когда я попытался прочитатьфайл parguet, столбец D включает двойные кавычки, как вы упомянули

>>> spark.read.parquet('hdfs://localhost:8020/test/exPar').show()
+---+---+---+----------------+---+
|  A|  B|  C|               D|  E|
+---+---+---+----------------+---+
|  1|  2|3,4|"a, ""HEllo"" c"|  5|
+---+---+---+----------------+---+

Затем я определил функцию, которая называется strip, и использую ее с функцией regexp_replace для создания строки, которую вы хотите увидеть

>>> import pyspark.sql.functions as func
>>> strip=func.udf(lambda x: x.strip('"'))
>>>
>>> spark.read.parquet('hdfs://localhost:8020/test/exPar').withColumn('D', func.regexp_replace(strip('D'), '""', '"')).show()
+---+---+---+------------+---+
|  A|  B|  C|           D|  E|
+---+---+---+------------+---+
|  1|  2|3,4|a, "HEllo" c|  5|
+---+---+---+------------+---+

Может быть, есть и другие решения, но в этом случае я думаю, что вы должны использовать функции udf или sql

...