SparkSQL和UDT

时间:2015-03-16 16:56:50

标签: apache-spark apache-spark-sql

我尝试使用SparkSQL(v.1.3.0)来访问PostgreSQL数据库。在这个数据库中,我有一个表

CREATE TABLE test (
 id bigint,
 values double precision[]
);

为了访问该表,我使用

val sparkConf = new SparkConf().setAppName("TestRead").setMaster("local[2]")
val sc = new SparkContext(sparkConf)
val sqlContext = new SQLContext(sc)

val jdbcDF = sqlContext.load("jdbc", Map(
  "url" -> "jdbc:postgresql://...",
  "dbtable" -> "schema.test",
  "user" -> "...",
  "password" -> "..."))

sqlContext.sql("SELECT * FROM schema.test")

但是,每当我尝试访问包含此数组的表时,我都会得到java.sql.SQLException: Unsupported type 2003

我在Spark测试代码中找到了一个示例,它在Spark中为二维点创建了一个UDT(参见ExamplePointUDT.scala)。但是,我不明白我怎么可能使用这段代码。

1 个答案:

答案 0 :(得分:0)

这可以通过在查询中强制转换来实现,至少在 pyspark 中实现。 不要让不受支持的类型到达spark,将它们转移到db,然后在获取表后再将它们抛回。

我不确定语法是否正确,但它会是这样的:

val query_table = "(SELECT id, CAST(values AS TEXT) FROM schema.test) AS casted_table"

val jdbcDF = sqlContext.load("jdbc", Map(
  "url" -> "jdbc:postgresql://...",
  "dbtable" -> query_table,
  "user" -> "...",
  "password" -> "..."))

jdbcDF.map(x => (x.id, x.values.toArray))

我很确定没有.toArray将字符串表示形式转换回数组,它只是占位符代码..但现在只需要正确解析它。

当然,这只是一个补丁,但它确实有效。