在PySpark中运行自定义Apache Phoenix SQL查询

时间:2017-04-18 22:58:25

标签: apache-spark pyspark apache-spark-sql spark-dataframe phoenix

有人可以使用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()

感谢。

3 个答案:

答案 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|
+---------+--------------------+------+