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_BEutf_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:UDF 将正则表达式应用于数据帧中的每一行

当列表值与Pyspark数据帧中的列值的子字符串匹配时,填充新列

CSV 文件中的任何“null”字符串都应替换为 pyspark 数据帧中的 SQL 值 null - Databricks

pyspark 数据帧中的完全外连接

在 Spark 中使用 LSH 对数据帧中的每个点运行最近邻查询

使用pyspark计算每行数据帧中的总值