【发布时间】:2017-10-01 06:07:11
【问题描述】:
我正在尝试使用 Spark 的 JDBC 访问存储在远程集群上的表(ORC 格式):
val jdbcDF = spark.read
.format("jdbc")
.option("url", url)
.option("dbtable", "metrics")
.option("user", user)
.option("password", password)
.load()
但是,无论我做什么,我都会不断收到此错误:
原因:java.sql.SQLException:无法将第 2 列转换为 long: java.lang.NumberFormatException:对于输入字符串:“metrics.t” at org.apache.hive.jdbc.HiveBaseResultSet.getLong(HiveBaseResultSet.java:372) 在 org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$org$apache$spark$sql$execution$datasources$jdbc$JdbcUtils$$makeGetter$8.apply(JdbcUtils.scala:365) 在 org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$org$apache$spark$sql$execution$datasources$jdbc$JdbcUtils$$makeGetter$8.apply(JdbcUtils.scala:364) 在 org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anon$1.getNext(JdbcUtils.scala:286) 在 org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anon$1.getNext(JdbcUtils.scala:268) 在 org.apache.spark.util.NextIterator.hasNext(NextIterator.scala:73) 在 org.apache.spark.util.CompletionIterator.hasNext(CompletionIterator.scala:32) 在 org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIterator.processNext(未知 来源)在 org.apache.spark.sql.execution.BufferedRowIterator.hasNext(BufferedRowIterator.java:43) 在 org.apache.spark.sql.execution.WholeStageCodegenExec$$anonfun$8$$anon$1.hasNext(WholeStageCodegenExec.scala:377) 在 org.apache.spark.sql.execution.SparkPlan$$anonfun$2.apply(SparkPlan.scala:231) 在 org.apache.spark.sql.execution.SparkPlan$$anonfun$2.apply(SparkPlan.scala:225) 在 org.apache.spark.rdd.RDD$$anonfun$mapPartitionsInternal$1$$anonfun$apply$25.apply(RDD.scala:826) 在 org.apache.spark.rdd.RDD$$anonfun$mapPartitionsInternal$1$$anonfun$apply$25.apply(RDD.scala:826) 在 org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38) 在 org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:323) 在 org.apache.spark.rdd.RDD.iterator(RDD.scala:287) 在 org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:87) 在 org.apache.spark.scheduler.Task.run(Task.scala:99) 在 org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:282) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 java.lang.Thread.run(Thread.java:745) 原因: java.lang.NumberFormatException:对于输入字符串:“metrics.t” at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 在 java.lang.Long.parseLong(Long.java:589) 在 java.lang.Long.parseLong(Long.java:631) 在 org.apache.hive.jdbc.HiveBaseResultSet.getLong(HiveBaseResultSet.java:368) ... 22 更多
输入字符串“metrics.t”对应于表名和第二列的名称,“t”,其特征在于时间戳。
如何跳过带有 JDBC 格式的标头?
CSV 选项 ("header", true) 在我的情况下无效。
PS:Spark 2.1.0 版
【问题讨论】:
-
url是什么?您是否正在从 Hive 阅读? -
@JacekLaskowski 是的,我正在从 Hive 阅读。这是网址:
val url = "jdbc:hive2://localhost:10000/default"
标签: scala apache-spark jdbc hive orc