当前的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' 部分。
答案 0 :(得分:3)
无法从Spark json
API动态查询jsonb
/ DataFrame
字段。将数据提取到Spark后,它将转换为字符串,不再是可查询的结构(请参阅:SPARK-7869)。
正如您已经发现的那样,您可以使用dbtable
/ table
参数将子查询直接传递给源,并使用它来提取感兴趣的字段。几乎相同的规则适用于任何非标准类型,调用存储过程或任何其他扩展。