【发布时间】:2021-05-13 10:48:12
【问题描述】:
我们有包含二进制列的数据框,当我们将数据框保存为 csv 时,二进制列会导致 csv 解析器出现问题。
有没有办法强制 spark csv write 写出hex 或base64 编码字符串中的任何二进制列?
【问题讨论】:
标签: dataframe csv apache-spark apache-spark-sql
我们有包含二进制列的数据框,当我们将数据框保存为 csv 时,二进制列会导致 csv 解析器出现问题。
有没有办法强制 spark csv write 写出hex 或base64 编码字符串中的任何二进制列?
【问题讨论】:
标签: dataframe csv apache-spark apache-spark-sql
您可以检查df.dtypes 类型是否等于BinaryType,然后将其转换为base64 字符串。在 Scala 中你可以这样写:
val castedCols = df.dtypes.map { case (c, t) =>
if (t == "BinaryType") base64(col(c)).as(c) else col(c)
}
val df1 = df.select(castedCols:_*)
df1.write.csv(outputPath)
【讨论】:
可以查看列类型,如果类型是二进制,可以强制转换为十六进制字符串:
import pyspark.sql.functions as F
from pyspark.sql.types import BinaryType
df_out = df.select([
F.hex(c.name).alias(c.name)
if isinstance(c.dataType, BinaryType)
else F.col(c)
for c in df.schema
])
df_out.write.csv('output', header=True)
【讨论】: