首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >HDInsight集群中的UTF-8文本与火花结果编码错误的'ascii‘编解码器不能在位置编码字符:序数不在范围内(128个)

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

Stack Overflow用户
提问于 2016-06-08 09:19:10
回答 1查看 1.7K关注 0票数 1

试图与希伯来字符UTF-8 TSV文件在HDInsight集群与火花在Linux和我得到编码错误,有什么建议吗?

这是我的电火花笔记本代码:

代码语言:javascript
运行
复制
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)回溯(最近一次调用):UnicodeEncodeError:'ascii’编解码器不能在第6-11位置编码字符:序数不在范围内(128)

希伯来语文本文件内容:

代码语言:javascript
运行
复制
id  name    age 
1   גיא 37
2   maor    32 
3   danny   55

当我尝试英文文件时,它工作得很好:

英文文本文件内容:

代码语言:javascript
运行
复制
id  name    age
1   guy     37
2   maor    32
3   danny   55

输出:

代码语言:javascript
运行
复制
name: guy
name: maor
name: danny
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-10 02:41:23

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

代码语言:javascript
运行
复制
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类型的列表:

代码语言:javascript
运行
复制
[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注册一个表:

代码语言:javascript
运行
复制
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()

您会注意到,从DataFrame中返回的Python DataFrame中的所有字符串都是Pythonunicode类型的:

代码语言:javascript
运行
复制
[Row(name=u'\u05d2\u05d9\u05d0'), Row(name=u'maor'), Row(name=u'danny')]

现在正在运行:

代码语言:javascript
运行
复制
%%sql
SELECT * FROM transactionsTempTable

将得到预期的结果:

代码语言:javascript
运行
复制
name: גיא
name: maor
name: danny

请注意,如果您想对这些名称做一些工作,您可能希望使用它们作为unicode字符串。来自这篇文章

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37698276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档