SPARK read.jdbc&自定义架构

时间:2018-06-04 09:25:41

标签: apache-spark

使用spark.read.format ...一次可以非编程方式添加自定义模式,如下所示:

val df = sqlContext
.read()
.format("jdbc")
.option("url", "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true")
.option("user", "root")
.option("password", "password")
.option("dbtable", sql)
.schema(customSchema)
.load();

但是,使用spark.read.jdbc,我似乎无法做同样的事情或者找到与上面相同的语法。我在SPARK 2.x中缺少什么或改变了什么?我在手册中读到了这一点: ... Spark自动从数据库表中读取模式,并将其类型映射回Spark SQL类型。 ...... 据推测,我正在尝试做的事情已经不再像上面的例子那样可能了。

val dataframe_mysql = spark.read.jdbc(jdbcUrl, "(select k, v from sample) e ", connectionProperties)

我最终尝试了这个:

val dataframe_mysql = spark.read.schema(openPositionsSchema).jdbc(jdbcUrl, "(select k, v from sample) e ", connectionProperties)

得到了这个:

org.apache.spark.sql.AnalysisException: User specified schema not supported with `jdbc`;

似乎以某种方式逆行。

3 个答案:

答案 0 :(得分:2)

  

。我在SPARK 2.x中缺少什么或改变了什么?

你不会错过任何东西。从不支持使用JDBC源修改读取模式。输入已经输入,因此schema没有地方。

如果类型不满意,只需cast将结果转换为所需类型。

答案 1 :(得分:1)

我不同意答案。

您可以使用您的方法或通过设置属性来提供自定义架构:

 connectionProperties.put("customSchema", schemachanges);

其中模式以“字段名称”,“新数据类型”,...格式更改的地方:...

 "key String, value DECIMAL(20, 0)"

如果key是原始表中的一个数字,它将生成一个SQL查询,例如“ key ::字符不同,value :: numeric(20,0)”

它比强制转换更好,因为强制转换是在选择原始类型后执行的映射操作,而自定义模式则不是。

我有一种情况,当spark无法从postgres Numeric中选择NaN时,因为它会将数字映射到不允许NaN的java BigDecimal中,所以每次读取这些值时spark作业都会失败。演员表产生了相同的结果。但是,将方案更改为String或Double后,它可以正确读取它。

火花文档:https://spark.apache.org/docs/latest/sql-data-sources-jdbc.html

答案 2 :(得分:1)

您可以使用“自定义”架构并放入属性参数。您可以在https://spark.apache.org/docs/latest/sql-data-sources-jdbc.html

上阅读更多内容

创建变量: c_schema ='id_type INT'

属性配置: config = {“ user”:“ xxx”, “ password”:“ yyy”, “ driver”:“ com.mysql.jdbc.Driver”, “ customSchema”:c_schema}

阅读表格并创建DF: df = spark.read.jdbc(url = jdbc_url,table ='table_name',properties = config)

您必须使用相同的列名,并且仅更改该列 您将其放入自定义架构中。