当前位置: 首页 > 知识库问答 >
问题:

HDInsight集群中的UTF-8文本有火花结果编码错误'ascii'编解码器无法在位置编码字符:序数不在范围内(128)

江佐
2023-03-14

在Linux上使用spark在HDInsight集群中使用希伯来字符UTF-8 TSV文件时,我发现编码错误,有什么建议吗?

这是我的pyspark笔记本代码:

from pyspark.sql import *
# Create an RDD from sample data
transactionsText = sc.textFile("/people.txt")

header = transactionsText.first()

# Create a schema for our data
Entry = Row('id','name','age')

# Parse the data and create a schema
transactionsParts = transactionsText.filter(lambda x:x !=header) .map(lambda l: l.encode('utf-8').split("\t"))
transactions = transactionsParts.map(lambda p: Entry(str(p[0]),str(p[1]),int(p[2])))

# Infer the schema and create a table       
transactionsTable = sqlContext.createDataFrame(transactions)

# SQL can be run over DataFrames that have been registered as a table.
results = sqlContext.sql("SELECT name FROM transactionsTempTable")

# The results of SQL queries are RDDs and support all the normal RDD operations.
names = results.map(lambda p: "name: " + p.name)

for name in names.collect():
  print(name)

错误:

'ascii'编解码器不能编码位置6-11的字符:序数不在范围内(128)Traceback(最近的调用最后): UnicodeEncodeError:'ascii'编解码器不能编码位置6-11的字符:序数不在范围内(128)

希伯来文文本文件内容:

id  name    age 
1   גיא 37
2   maor    32 
3   danny   55

当我尝试使用英语文件时,效果很好:

英文文本文件内容:

id  name    age
1   guy     37
2   maor    32
3   danny   55

输出:

name: guy
name: maor
name: danny

共有1个答案

陆高峰
2023-03-14

如果使用希伯来语文本运行以下代码:

from pyspark.sql import *

path = "/people.txt"
transactionsText = sc.textFile(path)

header = transactionsText.first()

# Create a schema for our data
Entry = Row('id','name','age')

# Parse the data and create a schema
transactionsParts = transactionsText.filter(lambda x:x !=header).map(lambda l: l.split("\t"))

transactions = transactionsParts.map(lambda p: Entry(unicode(p[0]), unicode(p[1]), unicode(p[2])))

transactions.collect()

您会注意到,您将这些名称作为Unicode类型的列表:

[Row(id=u'1', name=u'\u05d2\u05d9\u05d0', age=u'37'), Row(id=u'2', name=u'maor', age=u'32 '), Row(id=u'3', name=u'danny', age=u'55')]

现在,我们将使用事务RDD注册一个表:

table_name = "transactionsTempTable"

# Infer the schema and create a table       
transactionsDf = sqlContext.createDataFrame(transactions)
transactionsDf.registerTempTable(table_name)

# SQL can be run over DataFrames that have been registered as a table.
results = sqlContext.sql("SELECT name FROM {}".format(table_name))

results.collect()

您会注意到PysparkDataFrame中的所有字符串都是从sqlContext返回的。sql(…将是Pythonunicode类型:

[Row(name=u'\u05d2\u05d9\u05d0'), Row(name=u'maor'), Row(name=u'danny')]

现在运行:

%%sql
SELECT * FROM transactionsTempTable

将得到预期的结果:

name: גיא
name: maor
name: danny

请注意,如果您想对这些名称进行一些处理,您应该将它们作为unicode字符串进行处理。从这篇文章中:

当您处理文本操作(查找字符串中的字符数或在单词边界上剪切字符串)时,您应该处理unicode字符串,因为它们以一种适当的方式将字符抽象为您将在页面上看到的字母序列。在处理I/O、读取磁盘、打印到终端、通过网络链路发送内容等时,您应该处理byte str,因为这些设备将需要处理表示抽象字符的字节的具体实现。

 类似资料:
  • 问题内容: 我想解析我的XML文档。所以我将我的XML文档存储如下 现在我的下面是我的代码 我低于错误 问题答案: 看来您要达到UTF-8字节顺序标记(BOM)。尝试使用此Unicode字符串并提取出BOM: 我使用而不是因为在您的情况下您可能多次出现BOM表,这可能是由于串联的文件内容引起的。

  • 问题内容: 当我尝试将其串联时,当字段包含“ñ”或“´”时,出现UnicodeDecodeError。如果包含“ñ”或“´”的字段是最后一个,则不会有任何错误。 任何想法?非常感谢! 问题答案: 您正在编码为UTF-8,然后 重新 编码为UTF-8。Python仅在首先再次 解码 为Unicode时才能这样做,但它必须使用默认的ASCII编解码器: 不要继续编码;将编码保留为UTF-8 到最后一个

  • 问题内容: 我正在尝试使用其中包含一些非标准字符的超大型数据集。根据工作规范,我需要使用unicode,但我感到困惑。(而且很可能做错了。) 我使用以下方式打开CSV: 然后,我尝试使用以下代码对其进行编码: 我正在对lat和lng以外的所有内容进行编码,因为它们需要发送到API。当我运行程序以将数据集解析为可以使用的数据时,将获得以下Traceback。 我想我应该告诉你我正在使用python

  • 问题内容: 在我的其中一台计算机上,当我使用Google Apps引擎或Django时出现错误。 例如: app.yaml demas1252c.py foto.html 错误信息: 当我在Django中使用静态文件(不带gae)时,我遇到了非常类似的错误(具有不同的堆栈)。 我试图找到错误的原因,并向mimetypes.py添加了代码: 然后,我在控制台中收到下一条消息: 在注册表HKCR /

  • 我得到了Unicodeer错误: “ascii”编解码器无法对73-74位置的字符进行编码:序号不在范围内(128) python3 defult编码不是“UTF-8”吗?? 当我运行这个脚本时 实际上是蟒蛇。5.2 当我打印身体的类型,它是str 但是错误似乎是asciicode而不是python2的Unicode thx

  • 问题内容: 我已经从[python网站] [1]复制了此脚本,这是另一个问题,但是现在编码存在问题: 这次编码问题,当我运行它时,出现了这个错误: 然后我将所有整数都转换为字符串,但是这次我得到了这个错误: 我已经在上面实现了处理Unicode字符的方法,但是它给了我这种错误。有什么问题以及如何解决? 问题答案: 然后我将所有整数都转换为字符串, 您将整数 和 字符串都转换为 字节字符串 。对于字