簡體   English   中英

Spark-sql 讀取配置單元表失敗

[英]Spark-sql read hive table failed

我想通過 hive jdbc 連接將整個 hive 表加載到 spark 內存中。 並且已經在我的項目中添加了 hive-site.xml、hdfs-site.xml。 由於成功獲取列名(例如.role_id),spark 已連接 hive。 但是 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 。一種 pache.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.clou dera2] 在 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。迭代器(RDD.scala:287) ~[spark-core_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2] 在 org.apache.spark.scheduler.ResultTask.runTask(Result Task.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表?

你可以嘗試一個簡單的練習,看看 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();

我以各種形式看到這個問題。

星火使用JDBC訪問蜂巢。 它位於帶有 sc 的內置 Hadoop / HDFS 域中。

由於 KUD​​U 的安全方面,Spark 可能會使用 Impala 的 JDBC 來訪問 KUDU 表 - 粒度太粗。 您可以對 Hive 使用 IMPALA 方法,但為什么要這樣做呢?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM