分享

求大神解答。DataFrame想保存到Phoenix上

remarkzhao 发表于 2017-7-26 11:26:51 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 15 19786
val jdbcDF = spark.read.format("jdbc").option("url","jdbc:sqlserver://192.168.1.21;username=sa;password=yishidb;database=CDRDB16").option("driver","com.microsoft.sqlserver.jdbc.SQLServerDriver").option("dbtable","DC_PATIENT").load()   这个是我从sqlserver里拉出来的表   没问题

jdbcDF.write.mode(SaveMode.Overwrite).options(Map("table" -> "DC_PATIENT", "zkUrl" -> "hadoop001:2181")).format("org.apache.phoenix.spark").save()   这句话就出现以下错误。。


scala> jdbcDF.write.mode(SaveMode.Overwrite).options(Map("table" -> "DC_PATIENT", "zkUrl" -> "hadoop001:2181")).format("org.apache.phoenix.spark").save()
<console>:26: error: not found: value SaveMode
       jdbcDF.write.mode(SaveMode.Overwrite).options(Map("table" -> "DC_PATIENT", "zkUrl" -> "hadoop001:2181")).format("org.apache.phoenix.spark").save()
                         ^



已有(15)人评论

跳转到指定楼层
remarkzhao 发表于 2017-7-27 13:01:40
nextuser 发表于 2017-7-27 12:43
https://spark.apache.org/docs/latest/sql-programming-guide.html
save可以为空。
楼主是从哪看到的 ...

刚找到一个hbase-spark依赖的jar,放弃phoenix
尝试了两种写法
scala> jdbcDF.write.format('org.apache.spark.sql.execution.datasources.hbase').mode("overwrite").option("zkUrl","hadoop001:2181").save()
<console>:1: error: unclosed character literal
jdbcDF.write.format('org.apache.spark.sql.execution.datasources.hbase').mode("overwrite").option("zkUrl","hadoop001:2181").save()





scala> jdbcDF.write.options(Map("table" -> "DC_PATIENT","zkUrl" -> "hadoop001:2181")).format("org.apache.hadoop.hbase.spark").mode("overwrite").save()
java.lang.AbstractMethodError: org.apache.hadoop.hbase.spark.DefaultSource.createRelation(Lorg/apache/spark/sql/SQLContext;Lorg/apache/spark/sql/SaveMode;Lscala/collection/immutable/Map;Lorg/apache/spark/sql/Dataset;)Lorg/apache/spark/sql/sources/BaseRelation;
  at org.apache.spark.sql.execution.datasources.DataSource.write(DataSource.scala:472)
  at org.apache.spark.sql.execution.datasources.SaveIntoDataSourceCommand.run(SaveIntoDataSourceCommand.scala:48)
  at org.apache.spark.sql.execution.command.ExecutedCommandExec.sideEffectResult$lzycompute(commands.scala:58)
  at org.apache.spark.sql.execution.command.ExecutedCommandExec.sideEffectResult(commands.scala:56)
  at org.apache.spark.sql.execution.command.ExecutedCommandExec.doExecute(commands.scala:74)
  at org.apache.spark.sql.execution.SparkPlan$$anonfun$execute$1.apply(SparkPlan.scala:117)
  at org.apache.spark.sql.execution.SparkPlan$$anonfun$execute$1.apply(SparkPlan.scala:117)
  at org.apache.spark.sql.execution.SparkPlan$$anonfun$executeQuery$1.apply(SparkPlan.scala:138)
  at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:151)
  at org.apache.spark.sql.execution.SparkPlan.executeQuery(SparkPlan.scala:135)
  at org.apache.spark.sql.execution.SparkPlan.execute(SparkPlan.scala:116)
  at org.apache.spark.sql.execution.QueryExecution.toRdd$lzycompute(QueryExecution.scala:92)
  at org.apache.spark.sql.execution.QueryExecution.toRdd(QueryExecution.scala:92)
  at org.apache.spark.sql.DataFrameWriter.runCommand(DataFrameWriter.scala:610)
  at org.apache.spark.sql.DataFrameWriter.save(DataFrameWriter.scala:233)
  ... 52 elided



参考的连接在这: http://blog.csdn.net/strongyoung88/article/details/52197522

https://hbase.apache.org/book.html#_sparksql_dataframes

但是我一直有个疑问 既然dataframe是自带schema,我是不是可以不用事先在hbase里建表?看官网好像是要先定义catalog,我的表有60多个字段 那会很累。

回复

使用道具 举报

jixianqiuxue 发表于 2017-7-26 11:51:54
这种形式,没有讲过。
使用的是下面方式
val props = new Properties()  
jdbcDF.write.mode(SaveMode.Overwrite).jdbc(url,"zfs_test",prop)

回复

使用道具 举报

remarkzhao 发表于 2017-7-26 11:54:01
jixianqiuxue 发表于 2017-7-26 11:51
这种形式,没有讲过。
使用的是下面方式
val props = new Properties()  

我试试。。。你这个是mysql还是哪个关系型数据库。
回复

使用道具 举报

tntzbzc 发表于 2017-7-26 14:18:58
remarkzhao 发表于 2017-7-26 11:54
我试试。。。你这个是mysql还是哪个关系型数据库。

里面是否为
Map<String, String> options = new HashMap<String, String>();

options应该为key和value吧。
x=Map("table" -> "DC_PATIENT", "zkUrl" -> "hadoop001:2181")
jdbcDF.write.mode(SaveMode.Overwrite).options(Map("table" -> "DC_PATIENT", "zkUrl" -> "hadoop001:2181")).format("org.apache.phoenix.spark").save()  
这里面缺少value值,利用x替换下面形式更加明白
jdbcDF.write.mode(SaveMode.Overwrite).options(x,缺y)).format("org.apache.phoenix.spark").save()  
回复

使用道具 举报

remarkzhao 发表于 2017-7-26 14:25:00
tntzbzc 发表于 2017-7-26 14:18
里面是否为
Map options = new HashMap();

跟这个应该应该没多大关系,因为SaveMode是dataframe的一种保存模式,跟保存到哪里没关系。我怀疑是哪里缺了jar包。
回复

使用道具 举报

tntzbzc 发表于 2017-7-26 14:43:38
remarkzhao 发表于 2017-7-26 14:25
跟这个应该应该没多大关系,因为SaveMode是dataframe的一种保存模式,跟保存到哪里没关系。我怀疑是哪里 ...

你可以试试,map里面key和value必须是配对的
回复

使用道具 举报

remarkzhao 发表于 2017-7-26 14:44:44
本帖最后由 remarkzhao 于 2017-7-26 15:06 编辑
tntzbzc 发表于 2017-7-26 14:43
你可以试试,map里面key和value必须是配对的

但是我不知道填啥value啊……
回复

使用道具 举报

remarkzhao 发表于 2017-7-26 15:41:51
tntzbzc 发表于 2017-7-26 14:43
你可以试试,map里面key和value必须是配对的

看了官网了。
最新的正确写法是:jdbcDF.save("org.apache.phoenix.spark", SaveMode.Overwrite, Map("table" -> "DC_PATIENT","zkUrl" -> "hadoop001:2181"))

不过抛出错误  error: value save is not a member of org.apache.spark.sql.DataFrame




回复

使用道具 举报

nextuser 发表于 2017-7-27 12:43:29
remarkzhao 发表于 2017-7-26 15:41
看了官网了。
最新的正确写法是:jdbcDF.save("org.apache.phoenix.spark", SaveMode.Overwrite, Map("t ...

https://spark.apache.org/docs/latest/sql-programming-guide.html
save可以为空。
楼主是从哪看到的。
产生 error: value save is not a member of org.apache.spark.sql.DataFrame这个错误可能两个原因。
1.依赖包没有加入
2.加错类型了。
最好贴出来链接来看看
回复

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条