解析Databricks Spark中的双引号

holgip5t  于 2023-05-18  发布在  Apache
关注(0)|答案(2)|浏览(191)

我有一个.csv文件,其中的行包含字符串值:

"315700H9VGE9BHU9DK42","""LEGOS s.r.o."", švédsky ""LEGOS bolag med begr.amsvar""","cs","",""

我的第二个字段偶尔会包含'字符串with括起来的“引号”values':

"""LEGOS s.r.o."", švédsky ""LEGOS bolag med begr.amsvar"""

当读入spark dataframe时,值将呈现:
"LEGOS s.r.o.", švédsky "LEGOS bolag med begr.amsvar"
我已经尝试过这个方法,并对注解掉的选项进行了修改,如in these docs所述。

df = (spark
    .read
    .format("csv")
    .option("header", True)
    .option("delimiter", ",")
    .option("multiline", True)
    .option("escapeQuotes", True)
    
    .option("quote", "\"")  
    .option("escape", "\"")

    # .option("escape", "\\")
    # .option("escape", '""') 
    # .option("escape", "\n")

    .schema(raw_schema)
    .csv(landing_schema_file)
     )

有什么想法吗
我运行的是Apache Spark 3.3.0和Scala 2.12

b0zn9rqh

b0zn9rqh1#

如果您的.csv文件只包含这一行:

"315700H9VGE9BHU9DK42","""LEGOS s.r.o."", švédsky ""LEGOS bolag med begr.amsvar""","cs","",""

你想返回:

+--------------------+-----------------------------------------------------+---+----+----+
|_c0                 |_c1                                                  |_c2|_c3 |_c4 |
+--------------------+-----------------------------------------------------+---+----+----+
|315700H9VGE9BHU9DK42|"LEGOS s.r.o.", švédsky "LEGOS bolag med begr.amsvar"|cs |null|null|
+--------------------+-----------------------------------------------------+---+----+----+

您可以用途:

spark.read.option("escape", "\"").csv(yourPath)

我希望这能回答你的问题,祝你好运!

6vl6ewon

6vl6ewon2#

好的,我想我已经把这个问题确定为与Databasericks和Spark如何处理数据有关,而不是阅读数据有关。
我正在阅读一个大的3GB .csv文件到Databasericks使用。根据这个answer和@vilabinot的回答:

df = (spark
    .read
    .format("csv")
    .option("header", True)
    .option("inferSchema", True)
    .option("multiline", True)
    .option("escape", "\"")
    .csv(file_path_or_directory)
     )

此数据集中的字段之一是国家代码。要测试读取的文件是否正常,请在以下内容上groupby和aggregate:

df.groupby("Country").agg(count("*").alias("count"))

这是错误值被返回的地方,即。非国家/地区代码作为组返回。
| 国家|计数|
| --------------|--------------|
| PL-10| 1|
| 1至10,AFIL Tower,L。H. ROAD,|1|
但是,如果我然后尝试过滤df到这些值:

display(df.filter(col('Country') == "PL-10"))

什么都没有回来。因此,我认为这实际上与Spark或Databricks试图优化不同功能的方式有关,而不是数据读取步骤本身。我尝试过的其他几个测试在groupby和filter上复制了这种行为:

  • 从json版本阅读数据
  • 将.csv拆分成更小的文件,例如here

作为参考,数据集是GLEIF LEI索引。

相关问题