我正在尝试读取一些镶木地板数据并显示前20行,这会引发以下异常:
UnicodeEncodeError: 'latin-1' codec can't encode character u'u2019' in position 2978: ordinal not in range(256)
我使用python连接器从Snowflake读取数据,并将其以拼花地板格式存储在HDFS上:
sf_cursor.execute(query)
results = sf_cursor.fetchall()
df = self.spark_sql_context.createDataFrame(results, DF_SCHEMA)
这是读取/显示代码:
input_df = spark_sql_context.read.parquet(input_path)
input_df.show(20)
从Snowflake读取数据时,找不到任何关于设置unicodeutf-8
的信息,所以想知道是否有一种方法可以对某些列进行编码以克服这个问题。任何建议都将不胜感激。
感谢
根据niko的回答,这似乎是一个已知的问题,我现在必须做以下事情来解决:
decode_udf= udf(lambda val: val.encode('utf-8'), StringType())
input_df = input_df.withColumn('COLUMN_NAME', decode_udf('COLUMN_NAME'))
我们在从Snowflake到Pandas读取数据时发现了类似的问题,这可能与您的问题有关。
问题是:
-
源中的原始数据被转换并转储为Snowflake,具有
Latin-1
编码,但在转储时,它被强制转换为utf-8
。出现了和你相同的错误。 -
一些可能需要预处理的特殊字符。
查找雪花转储之前的源数据编码。
Snowflake的贡献者在这里讨论了这一点,可能会帮助你:https://github.com/snowflakedb/snowflake-connector-python/issues/574