使用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`;
似乎以某种方式逆行。
答案 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)
您必须使用相同的列名,并且仅更改该列 您将其放入自定义架构中。