有人可以使用pyspark提供有关如何运行自定义Apache Phoenix SQL查询并将该查询的结果存储在RDD或DF中的示例。注意:我正在寻找自定义查询,而不是要读入RDD的整个表。
从Phoenix Documentation,加载整个表我可以使用:
table = sqlContext.read \
.format("org.apache.phoenix.spark") \
.option("table", "<TABLENAME>") \
.option("zkUrl", "<hostname>:<port>") \
.load()
我想知道使用自定义SQL的相应等价物是什么
sqlResult = sqlContext.read \
.format("org.apache.phoenix.spark") \
.option("sql", "select * from <TABLENAME> where <CONDITION>") \
.option("zkUrl", "<HOSTNAME>:<PORT>") \
.load()
感谢。
答案 0 :(得分:2)
这可以使用Phoenix作为JDBC数据源来完成,如下所示:
sql = '(select COL1, COL2 from TABLE where COL3 = 5) as TEMP_TABLE'
df = sqlContext.read.format('jdbc')\
.options(driver="org.apache.phoenix.jdbc.PhoenixDriver", url='jdbc:phoenix:<HOSTNAME>:<PORT>', dbtable=sql).load()
df.show()
但是应该注意的是,如果SQL语句中有列别名,则.show()语句会抛出异常(如果使用.select()来选择没有别名的列,它将起作用) ,这是凤凰城的一个可能的错误。
答案 1 :(得分:0)
在这里,您需要使用.sql来处理自定义查询。这是语法
dataframe = sqlContext.sql("select * from <table> where <condition>")
dataframe.show()
答案 2 :(得分:0)
对于Spark2,我对.show()函数没有问题,也没有使用.select()函数来打印来自Phoenix的DataFrame的所有值。 因此,请确保您的sql查询位于括号内,请看我的示例:
val sql = " (SELECT P.PERSON_ID as PERSON_ID, P.LAST_NAME as LAST_NAME, C.STATUS as STATUS FROM PERSON P INNER JOIN CLIENT C ON C.CLIENT_ID = P.PERSON_ID) "
val dft = dfPerson.sparkSession.read.format("jdbc")
.option("driver", "org.apache.phoenix.jdbc.PhoenixDriver")
.option("url", "jdbc:phoenix:<HOSTNAME>:<PORT>")
.option("useUnicode", "true")
.option("continueBatchOnError", "true")
.option("dbtable", sql)
.load()
dft.show();
它告诉我:
+---------+--------------------+------+
|PERSON_ID| LAST_NAME|STATUS|
+---------+--------------------+------+
| 1005| PerDiem|Active|
| 1008|NAMEEEEEEEEEEEEEE...|Active|
| 1009| Admission|Active|
| 1010| Facility|Active|
| 1011| MeUP|Active|
+---------+--------------------+------+