【问题标题】:Python Spark - Escaping quotes in parquet filePython Spark - 在镶木地板文件中转义引号
【发布时间】:2019-02-28 11:54:05
【问题描述】:

我的 parquet 文件源自 CSV,其中一些单元格被转义。例如:这是一个值

"a , ""Hello"" c"

我希望 Parquet 将其读取为

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'。 有什么办法让它工作吗?

输入 parquet 是从 CSV 文件转换而来的

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

编辑:Parquet 已经生成。我无法改变拼花地板的生成方式。我必须使用我得到的镶木地板并尝试逃跑。

【问题讨论】:

  • 如何从 CSV 创建镶木地板文件?使用 spark-csv 读取为 csv 并写入为 parquet?
  • 你在做这个吗? spark.read.option("quote", "\"").option("escape", "\"").csv("data.csv").write.parquet("temp.parquet")。这对我有用
  • Parquet 已经由其他人生成。我无法更改镶木地板格式。我刚刚提到它是为了提供更多信息

标签: apache-spark pyspark parquet


【解决方案1】:

据我所知,镶木地板文件只有一种选择。它用于压缩。 'quote'、'delimiter'、'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 文件并再次将其保存为 parquet 文件

>>> 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 函数

【讨论】:

    猜你喜欢
    • 2020-03-19
    • 2019-11-20
    • 2019-06-02
    • 2015-06-29
    • 1970-01-01
    • 2016-07-04
    • 1970-01-01
    • 2017-11-11
    • 2017-01-22
    相关资源
    最近更新 更多