无法创建Spark Phoenix DataFrames

时间:2016-07-11 18:17:52

标签: apache-spark dataframe hbase phoenix

我正在尝试将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

我仍然很新兴。如果有人能提供帮助,我们将非常感激!

1 个答案:

答案 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默认值,但是   我将特别为此创建另一个问题。我包括了一个   也忽略了此补丁中的集成测试。