apache-spark - PySpark escapeQuotes=False 仍然转义引号
问题描述
问题:将数据框写为 csv 时,我不想转义引号。但是,设置escapeQuotes=False
似乎不起作用。
下面提到的是一个示例案例:
数据准备:
from pyspark.sql.types import StructType, StructField, StringType, IntegerType
from pyspark.sql import SparkSession, functions as func
spark = SparkSession.builder.appName("test").getOrCreate()
data = [("James", "Smith"),
("Michael", "Rose"),
]
schema = StructType([ \
StructField("firstname",StringType(),True), \
StructField("lastname",StringType(),True)
])
df = spark.createDataFrame(data=data,schema=schema)
df.show(truncate=False)
输出:
+---------+--------+
|firstname|lastname|
+---------+--------+
|James |Smith |
|Michael |Rose |
+---------+--------+
添加带有换行符的列
def create_column_with_newline(elem):
return f'"{elem["firstname"]}\n{elem["lastname"]}"'
columnWithNewlineUDF = func.udf(create_column_with_newline)
df = df.withColumn('newline_col', columnWithNewlineUDF(func.struct('firstname', 'lastname')))
df.show()
输出:
+---------+--------+-----------------+
|firstname|lastname| newline_col|
+---------+--------+-----------------+
| James| Smith| "James
Smith"|
| Michael| Rose| "Michael
Rose"|
+---------+--------+-----------------+
用 escapeQuotes=False 编写 csv
df.coalesce(1).write.csv('test.tsv', mode='overwrite', sep='\t', header=True, encoding='UTF-8', escapeQuotes=False)
输出:
firstname lastname newline_col
James Smith "\"James
Smith\""
Michael Rose "\"Michael
Rose\""
如您所见,newline_col
是用转义引号编写的 :-(
预期输出:
firstname lastname newline_col
James Smith "James
Smith"
Michael Rose "Michael
Rose"
解决方案
推荐阅读
- php - 在 MySQL 5 .7 中转换 CTE 查询?
- google-apps-script - 如果复选框选中设置值
- firebase - Firebase 托管 Webhook
- user-tracking - 可以在用户流工具中打开网络分析插件吗?
- sql - 在使用窗口函数时在子查询和游标块中调用 AVG 函数时查询永远不会完成
- php - Laravel 8 单元测试 - assertJson() 如何在控制器中捕获它
- c++ - ESP32 上的 Spotify Web api 连接被拒绝
- python - Visual Studio 代码:忽略 Python 示例中的前导“>>>”
- python - 为什么在使用 cmake 时编译 swig 二进制文件只会产生一个 `pyd` 文件,而手动命令也会产生一个 `py` 文件?
- angular - Angular / RxJS - 在应用程序初始化期间不要重复相同的 GET 请求