我正在尝试将Apache Phoenix中的数据加载到Spark DataFrame中。
我已经能够使用以下代码成功创建RDD:
val sc = new SparkContext("local", "phoenix-test")
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
val foo: RDD[Map[String, AnyRef]] = sc.phoenixTableAsRDD(
table = "FOO",
columns = Seq("ID", "MESSAGE_EPOCH", "MESSAGE_VALUE"),
zkUrl = Some("<zk-ip-address>:2181:/hbase-unsecure"))
foo.collect().foreach(x => println(x))
然而,我没有那么幸运尝试创建一个DataFrame。我目前的尝试是:
val sc = new SparkContext("local", "phoenix-test")
val sqlContext = new SQLContext(sc)
val df = sqlContext.phoenixTableAsDataFrame(
table = "FOO",
columns = Seq("ID", "MESSAGE_EPOCH", "MESSAGE_VALUE"),
zkUrl = Some("<zk-ip-address>:2181:/hbase-unsecure"))
df.select(df("ID")).show
不幸的是,上面的代码导致了ClassCastException:
java.lang.ClassCastException: org.apache.spark.sql.catalyst.expressions.GenericMutableRow cannot be cast to org.apache.spark.sql.Row
我仍然很新兴。如果有人能提供帮助,我们将非常感激!
答案 0 :(得分:2)
虽然你还没有提到你的火花版本和异常细节......
请参阅PHOENIX-2287 which is fixed,其中包含
环境:在OS X *上以独立模式运行HBase 1.1.1
Spark 1.5.0 Phoenix 4.5.2
Josh Mahonin添加了评论 - 23 / Sep / 15 17:56更新了补丁 支持Spark 1.5.0,并向后兼容 1.3.0(手动测试,Spark版本配置文件将来可能值得关注)在1.5.0中,它们已经消失并明确隐藏了
GenericMutableRow
数据结构。幸运的是,我们能够 面向外部的&#39;Row
&#39;数据类型,向后兼容,和 在未来的版本中也应保持兼容。作为一部分 更新后,Spark SQL在其DecimalType
&#39;上弃用了构造函数。 在更新这个时,我暴露了一个新问题,即我们没有 结转基础Decimal类型的精度和比例 通过Spark。目前我已将其设置为使用Spark默认值,但是 我将特别为此创建另一个问题。我包括了一个 也忽略了此补丁中的集成测试。