使用 Spark SQL 时无法将获取 B 转换为 java.lang.String

Posted

技术标签:

【中文标题】使用 Spark SQL 时无法将获取 B 转换为 java.lang.String【英文标题】:Getting B cannot be cast to java.lang.String when using Spark SQL 【发布时间】:2015-03-24 04:18:21 【问题描述】:

我的问题是当我尝试从sql.Row 读取数据作为String 时。我正在使用 pyspark,但我听说人们对 Scala API 也有这个问题。

pyspark.sql.Row 对象是一个非常顽固的生物。抛出以下异常:

java.lang.ClassCastException: [B cannot be cast to java.lang.String
 at org.apache.spark.sql.catalyst.expressions.GenericRow.getString(Row.scala 183)

所以我们有一个字段被表示为一个字节数组。以下 python 打印结构不起作用

repr(sqlRdd.take(2))

还有

import pprint
pprint.pprint(sqlRdd.take(2))

两者都会导致 ClassCastException。

那么.. 其他人是如何做到这一点的?我开始自己动手(不幸的是,这里无法复制/粘贴……)但这有点重新发明***……或者我怀疑。

【问题讨论】:

【参考方案1】:

试试

sqlContext.setConf("spark.sql.parquet.binaryAsString", "true")

我认为自从 Spark 1.1.0 以来他们打破了它 - 将二进制文件读取为过去可以工作的字符串,然后他们让它不起作用,但添加了这个标志,但将其默认设置为 false。

【讨论】:

不错!谢谢你回来(很晚),拿出反铲挖掘这个,并给出一个很好的解决方案。

以上是关于使用 Spark SQL 时无法将获取 B 转换为 java.lang.String的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spark Scala 将 Sql Server 数据类型转换为 Hive 数据类型

在 Spark 中执行聚合函数时出错:ArrayType 无法转换为 org.apache.spark.sql.types.StructType

11.spark sql之RDD转换DataSet

Spark SQL Java GenericRowWithSchema无法强制转换为java.lang.String

如何将具有嵌套StructType的列转换为Spark SQL中的类实例?

在 Spark SQL 中,将 JSON 键名转换为值