嗨,我需要在凤凰城创建一个表格。我已经尝试了以下2种方法,但它们都没有工作,似乎仍然不支持。
1)Dataframe.write仍然要求表先前存在
df.write.format("org.apache.phoenix.spark").mode("overwrite").option("table", schemaName.toUpperCase + "." + tableName.toUpperCase ).option("zkUrl", hbaseQuorum).save()
2)如果我们通过JDBC连接到phoenix,并尝试执行CREATE statemnt,那么我们得到一个解析错误(同样的创建在凤凰中工作)
var ddlCode="create table test (mykey integer not null primary key, mycolumn varchar) "
val driver = "org.apache.phoenix.jdbc.PhoenixDriver"
val jdbcConnProps = new Properties()
jdbcConnProps.setProperty("driver", driver);
val jdbcConnString = "jdbc:phoenix:hostname:2181/hbase-unsecure"
sqlContext.read.jdbc(jdbcConnString, ddlCode, jdbcConnProps)
错误: org.apache.phoenix.exception.PhoenixParserException:ERROR 601(42P00):语法错误。在第1栏第15栏遇到“创造”。
任何有类似挑战的人都能以不同方式做到这一点吗?
答案 0 :(得分:0)
我终于为此解决了问题。基本上我认为尝试使用SQLContext读取方法是错误的。我认为这种方法只是为了“读取”数据源而设计的。 workaournd的工作方式基本上是打开针对Phoenix的标准JDBC连接:
var ddlCode="create table test (mykey integer not null primary key, mycolumn varchar) "
val jdbcConnString = "jdbc:hostname:2181/hbase-unsecure"
val user="USER"
val pass="PASS"
var connection:Connection = null
Class.forName(driver)
connection = DriverManager.getConnection(jdbcConnString, user, pass)
val statement = connection.createStatement()
statement.executeUpdate(ddlCode)