Postgresql JSONB数据上的Spark SQL

时间:2015-12-28 03:08:31

标签: json postgresql apache-spark apache-spark-sql

当前的Postgresql版本(9.4)支持 json jsonb 数据类型,如http://www.postgresql.org/docs/9.4/static/datatype-json.html

中所述

例如,可以通过SQL查询查询存储为 jsonb 的JSON数据:

SELECT jdoc->'guid', jdoc->'name'
FROM api 
WHERE jdoc @> '{"company": "Magnafone"}';

作为Sparker用户,是否可以通过JDBC将此查询发送到Postgresql并将结果作为DataFrame接收?

到目前为止我尝试过:

val url = "jdbc:postgresql://localhost:5432/mydb?user=foo&password=bar"
val df = sqlContext.load("jdbc",
  Map("url"->url,"dbtable"->"mydb", "driver"->"org.postgresql.Driver"))
df.registerTempTable("table")
sqlContext.sql("SELECT data->'myid' FROM table")

但是sqlContext.sql()无法理解SQL中的 data->' myid' 部分。

1 个答案:

答案 0 :(得分:3)

无法从Spark json API动态查询jsonb / DataFrame字段。将数据提取到Spark后,它将转换为字符串,不再是可查询的结构(请参阅:SPARK-7869)。

正如您已经发现的那样,您可以使用dbtable / table参数将子查询直接传递给源,并使用它来提取感兴趣的字段。几乎相同的规则适用于任何非标准类型,调用存储过程或任何其他扩展。