Python Spark-在实木复合地板文件中转义引号

时间:2018-09-24 22:45:16

标签: apache-spark pyspark parquet

我的实木复合地板文件是从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 :(得分: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文件,然后再次将其另存为实木复合地板文件

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

相关问题