x00 出现在 Pyspark 数据帧中的每个字符之间
Posted
技术标签:
【中文标题】\x00 出现在 Pyspark 数据帧中的每个字符之间【英文标题】:\x00 is coming between each char in Pyspark dataframe 【发布时间】:2022-01-10 12:37:17 【问题描述】:我正在将 .CSV UTF-8 文件读入 Pyspark 数据帧。在数据框中获取 \x00 在数据框中每列的每个字符中。
例如 在 csv- 用户名
xyz
在数据框中,它像方形框一样进来。当 collect() 它显示如下。所以方框=\x00 \x00U\x00S\x00E....
\x00X\x00y\x00Z\x00
请帮忙
【问题讨论】:
b'\x00X\x00y\x00Z'.decode('utf_16_BE')
以及 b'X\x00y\x00Z\x00'.decode('utf_16_LE')
返回 XyZ
。使用正确的编码读取.csv
文件……
【参考方案1】:
问题
您的问题可能是您没有使用正确的编码读取文件。
推荐
您可以在读取 csv 文件时使用encoding
选项来实现此目的。 @JosefZ 建议使用utf_16_BE
和utf_16_LE
,这是确定文件使用的真实编码的良好开端。然而,虽然这些选项可能在 python 中有效,但 pyspark 正在寻找以下字符串编码值:
US-ASCII
ISO-8859-1
UTF-8
UTF-16BE
UTF-16LE
UTF-16
您可以了解更多关于字符串编码的信息here。
对于您的特定用例,您可以尝试使用.option("encoding","UTF-16")
或简单地使用上面列出的选项替换和测试编码,例如:
df = (
spark.read
.format("csv")
.option("header",False) # optional
.option("encoding","UTF-16")
.schema("username string") # optional
.load("testfile.d") # - replace with your actual file name
)
完全可重现的示例
# Creating test csv file
with open("testfile.d","wb") as fp:
fp.write(b'\x00X\x00y\x00Z') # writing encoded content
# reading and displaying content without specifying encoding
spark.read.format("csv").option("header",False).schema("username string").load("testfile.d").show()
+--------+
|username|
+--------+
| �X�y�Z|
+--------+
# reading and displaying content by specifying encoding
spark.read.format("csv").option("header",False).option("encoding","UTF-16").schema("username string").load("testfile.d").show()
+--------+
|username|
+--------+
| XyZ|
+--------+
【讨论】:
以上是关于x00 出现在 Pyspark 数据帧中的每个字符之间的主要内容,如果未能解决你的问题,请参考以下文章
当列表值与Pyspark数据帧中的列值的子字符串匹配时,填充新列
CSV 文件中的任何“null”字符串都应替换为 pyspark 数据帧中的 SQL 值 null - Databricks