【问题标题】:Spark-sql read hive table failedSpark-sql 读取配置单元表失败
【发布时间】:2018-08-09 06:51:05
【问题描述】:

我想通过 hive jdbc 连接将整个 hive 表加载到 spark 内存中。并且已经在我的项目中添加了 hive-site.xml、hdfs-site.xml。由于成功获取了列名(eg.role_id),spark 已经连接了配置单元。但 spark 似乎将列名作为数据加载,并引发异常。这是我的代码:

val df = spark.read.format("jdbc")
  .option("driver", CommonUtils.HIVE_DIRVER)
  .option("url", CommonUtils.HIVE_URL)
  .option("dbtable", "datasource_test.t_leave_map_base")
  .option("header", "true")
  .option("user", CommonUtils.HIVE_PASSWORD)
  .option("password", CommonUtils.HIVE_PASSWORD)
  .option("fetchsize", "20")
  .load()
df.registerTempTable("t_leave_map_base")
df.persist(StorageLevel.MEMORY_ONLY)
df.show()
df

并得到错误:

java.lang.NumberFormatException:对于输入字符串:“t_leave_map_base.role_id” 在 java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) ~[na:1.8.0_25] 在 java.lang.Long.parseLong(Long.java:589) ~[na:1.8.0_25] 在 java.lang.Long.valueOf(Long.java:803) ~[na:1.8.0_25] 在 org.apache.hive.jdbc.HiveBaseResultSet.getLong(HiveBaseResultSet.java:366) ~[hive-jdbc-1.1.0-cdh5.12.0.jar:1.1.0-cdh5.12.0] 在 org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$org$apache$spark$sql$execution$datasources$jdbc$JdbcUtils$$makeGetter$8.apply(JdbcUtils.scala:409) ~[ spark-sql_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2] 在 org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$org$apache$spark$sql$execution$datasources$jdbc$JdbcUtils$$makeGetter$8.apply(JdbcUtils.scala:408) ~[ spark-sql_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2] 在 org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anon$1.getNext(JdbcUtils.scala:330) ~[spark-sql_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2 ] 在 org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anon$1.getNext(JdbcUtils.scala:312) ~[spark-sql_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2 ] 在 org.apache.spark.util.NextIterator.hasNext(NextIterator.scala:73) ~[spark-core_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2] 在 org.apache.spark.InterruptibleIterator.hasNext(InterruptibleIterator.scala:37) ~[spark-core_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2] 在 org.apache.spark.util.CompletionIterator.hasNext(CompletionIterator.scala:32) ~[spark-core_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2] 在 org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIterator.processNext(Unknown Source) ~[na:na] 在 org.apache.spark.sql.execution.BufferedRowIterator.hasNext(BufferedRowIterator.java:43) ~[spark-sql_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2] 在 org.apache.spark.sql.execution.WholeStageCodegenExec$$anonfun$8$$anon$1.hasNext(WholeStageCodegenExec.scala:395) ~[spark-sql_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2 ] 在 org.apache.spark.sql.execution.columnar.InMemoryRelation$$anonfun$1$$anon$1.hasNext(InMemoryRelation.scala:133) ~[spark-sql_2.11-2.2.0.cloudera2.jar:2.2.0 .cloudera2] 在 org.apache.spark.storage.memory.MemoryStore.putIteratorAsValues(MemoryStore.scala:215) ~[spark-core_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2] 在 org.apache.spark.storage.BlockManager$$anonfun$doPutIterator$1.apply(BlockManager.scala:1038) ~[spark-core_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2] 在 org.apache.spark.storage.BlockManager$$anonfun$doPutIterator$1.apply(BlockManager.scala:1029) ~[spark-core_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2] 在 org.apache.spark.storage.BlockManager.doPut(BlockManager.scala:969) ~[spark-core_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2] 在 org.apache.spark.storage.BlockManager.doPutIterator(BlockManager.scala:1029) ~[spark-core_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2] 在 org.apache.spark.storage.BlockManager.getOrElseUpdate(BlockManager.scala:760) ~[spark-core_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2] 在 org.apache.spark.rdd.RDD.getOrCompute(RDD.scala:334) ~[spark-core_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2] 在 org.apache.spark.rdd.RDD.iterator(RDD.scala:285) ~[spark-core_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2] 在 org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38) ~[spark-core_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2] 在 org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:323) ~[spark-core_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2] 在 org.apache.spark.rdd.RDD.iterator(RDD.scala:287) ~[spark-core_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2] 在 org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38) ~[spark-core_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2] 在 org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:323) ~[spark-core_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2] 在 org.apache.spark.rdd.RDD.iterator(RDD.scala:287) ~[spark-core_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2] 在 org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:87) ~[spark-core_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2] 在 org.apache.spark.scheduler.Task.run(Task.scala:108) ~[spark-core_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2] 在 org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:338) ~[spark-core_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2] 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) ~[na:1.8.0_25] 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) ~[na:1.8.0_25] 在 java.lang.Thread.run(Thread.java:745) [na:1.8.0_25]

调试项目,所有 fetchedRows 都是列名:

不知道spark sql是否支持这种方式加载hive表?

【问题讨论】:

  • 我想知道为什么我不明白 - 但可能是其他答案支持我所说的
  • 尝试使用严格的 JDBC 驱动程序,例如您可以在 Cloudera 网站上下载的那个。 Apache 驱动程序是一个蹩脚的 Type 3 怪异,它不支持足够的 JDBC 功能来使用所有工具和框架。

标签: apache-spark hadoop hive


【解决方案1】:

您可以尝试一个简单的练习来查看 Spark.sql 是否正在从 HIve 获取数据。通常,我所理解的是 JDBC 不是从 Spark 连接到 Hive 的方式。

  1. 配置 spark-env.sh 参数以确保 Spark 使用元存储信息与 Hive 对话。
  2. 在您的机器中打开 Spark-shell。
  3. 在 spark-shell 中,使用如下语句
   spark.sql("use <hive_db_name>");
   val df = spark.sql("select count(1) from table");
   df.show();

【讨论】:

  • 这将帮助您了解表数据是否可以在 spark 上下文中访问。
【解决方案2】:

我看到这个问题有多种形式。

Spark使用 JDBC 访问 Hive。它位于带有 sc 的内置 Hadoop / HDFS 域中。

由于 KUD​​U 的安全性问题,Spark 可能会使用 JDBC for Impala 来访问 KUDU 表 - 粒度太粗。您可以对 Hive 使用 IMPALA 方法,但为什么要这样做?

【讨论】:

  • 我在 ES、Hive、HBase 等各种环境中有很多表......并且希望将来加载到 spark 以支持计算。
猜你喜欢
  • 2022-01-20
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2018-10-19
  • 1970-01-01
  • 2021-03-28
  • 2011-05-25
  • 1970-01-01
相关资源
最近更新 更多