代码之家  ›  专栏  ›  技术社区  ›  Sashank

Python Spark-parquet文件中的转义引号

  •  0
  • Sashank  · 技术社区  · 7 年前

    我的拼花文件是从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 回复  |  直到 7 年前
        1
  •  2
  •   Ali Yesilli    7 年前

    据我所知,只有一个选择拼花文件。它是用来压缩的。其他选项如'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')
    

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

    >>> 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|
    +---+---+---+------------+---+
    

    也许有其他不同的解决方案,但在这种情况下,我认为你应该使用自定义项或sql函数

    推荐文章