首页 > 解决方案 > 如何防止 pyspark 将逗号解释为以 JSON 对象为值的 csv 字段中的分隔符

问题描述

我正在尝试使用 pyspark 版本 2.4.5 和 Databrick 的 spark-csv 模块读取逗号分隔的 csv 文件。csv 文件中的一个字段具有一个 json 对象作为其值。csv的内容如下

测试.csv

header_col_1, header_col_2, header_col_3
one, two, three
one, {“key1”:“value1",“key2”:“value2",“key3”:“value3”,“key4”:“value4"}, three

我发现的其他解决方案已读取定义为"escape": '"''delimiter': "," 的选项。这似乎不起作用,因为相关字段中的逗号没有用双引号括起来。下面是我用来读取 csv 文件的源代码

测试.py

from pyspark.sql import SparkSession
import findspark

findspark.init()

spark = SparkSession.builder.appName('test').getOrCreate()

read_options = {
    'header': 'true',
    "escape": '"',
    'delimiter': ",",
    'inferSchema': 'false',
}

spark_df = spark.read.format('com.databricks.spark.csv').options(**read_options).load('test.csv')

print(spark_df.show())

上述程序的输出如下图

+------------+-----------------+---------------+
|header_col_1|     header_col_2|   header_col_3|
+------------+-----------------+---------------+
|         one|              two|          three|
|         one| {“key1”:“value1"|“key2”:“value2"|
+------------+-----------------+---------------+

标签: pythoncsvpyspark

解决方案


在 CSV 文件中,您必须将 JSON 字符串放在双引号中。JSON 字符串中的双引号必须用反斜杠 (\") 进行转义。删除您的转义选项,因为它不正确。默认情况下,分隔符设置为 ",",转义字符设置为 '\',引号字符设置为 ' “”。请参阅Databricks 文档


推荐阅读