当前位置: 首页 > 知识库问答 >
问题:

Spark-sql读取hive表失败

黄飞翮
2023-03-14

我想通过配置单元jdbc连接将整个配置单元表加载到spark内存中。并且已经添加了配置单元站点。html" target="_blank">xml,hdfs站点。xml在我的项目中。spark已连接配置单元,因为已成功获取列名(例如role_id)。但是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

和获取错误:

JAVAlang.NumberFormatException:对于输入字符串:“t_leave_map_base.role_id”在java中。lang.NumberFormatException。java上的forInputString(NumberFormatException.java:65)~[na:1.8.0_25]。朗,朗。java上的parseLong(Long.java:589)~[na:1.8.0_25]。朗,朗。org上的valueOf(Long.java:803)~[na:1.8.0_25]。阿帕奇。蜂箱jdbc。HiveBaseResultSet。getLong(HiveBaseResultSet.java:366)~[hive-jdbc-1.1.0-cdh5.12.0.jar:1.1.0-cdh5.12.0]位于org。阿帕奇。火花sql。处决数据源。jdbc。JdbcUtils$$anonfun$org$apache$spark$sql$execution$datasources$jdbc$JdbcUtils$$makeGetter$8。在org上应用(JdbcUtils.scala:409)~[spark-sql_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2]。阿帕奇。火花sql。处决数据源。jdbc。JdbcUtils$$anonfun$org$apache$spark$sql$execution$datasources$jdbc$JdbcUtils$$makeGetter$8。在org上应用(JdbcUtils.scala:408)~[spark-sql_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2]。阿帕奇。火花sql。处决数据源。jdbc。JdbcUtils$$anon$1。getNext(JdbcUtils.scala:330)~[spark-sql_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2]。阿帕奇。火花sql。处决数据源。jdbc。JdbcUtils$$anon$1。getNext(JdbcUtils.scala:312)~[spark-sql_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2]。阿帕奇。火花util。下滴定器。hasNext(NextIterator.scala:73)~[spark-core2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2]。阿帕奇。火花中断迭代器。hasNext(interruptableiterator.scala:37)~[spark-core_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2]。阿帕奇。火花util。补全器。hasNext(CompletionIterator.scala:32)~[spark-core2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2]。阿帕奇。火花sql。催化剂表达。GeneratedClass$GenerateEditor。processNext(未知源)~[na:na]位于组织。阿帕奇。火花sql。处决BufferedRowIterator。hasNext(bufferedrowterator.java:43)~[spark-sql_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2]位于org。阿帕奇。火花sql。处决批发商$$anonfun$8$$anon$1。hasNext(whistagecodegenexec.scala:395)~[spark-sql_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2]。阿帕奇。火花sql。处决专栏作家。InMemoryRelation$$anonfun$1$$anon$1。hasNext(InMemoryRelation.scala:133)~[spark-sql_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2]位于org。阿帕奇。火花存储记忆力记忆商店。putieratorasvalues(MemoryStore.scala:215)~[spark-core_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2]。阿帕奇。火花存储区块管理器$$anonfun$DOPUTIATOR$1。在org上应用(BlockManager.scala:1038)~[spark-core2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2]。阿帕奇。火花存储区块管理器$$anonfun$DOPUTIATOR$1。在org上应用(BlockManager.scala:1029)~[spark-core2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2]。阿帕奇。火花存储区块管理器。doPut(BlockManager.scala:969)~[spark-core_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2]。阿帕奇。火花存储区块管理器。doputierator(BlockManager.scala:1029)~[spark-core_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2]位于org。阿帕奇。火花存储区块管理器。getOrElseUpdate(BlockManager.scala:760)~[spark-core_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2]。阿帕奇。火花rdd。RDD。getOrCompute(RDD.scala:334)~[spark-core_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2]。阿帕奇。火花rdd。RDD。迭代器(RDD.scala:285)~[spark-core_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2]。阿帕奇。火花rdd。MapPartitionsRDD。计算(MapPartitionsRDD.scala:38)~[spark-core_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2]。阿帕奇。火花rdd。RDD。computeOrReadCheckpoint(RDD.scala:323)~[spark-core_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2]位于org。阿帕奇。火花rdd。RDD。迭代器(RDD.scala:287)~[spark-core_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2]。阿帕奇。火花rdd。MapPartitionsRDD。计算(MapPartitionsRDD.scala:38)~[spark-core_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2]。阿帕奇。火花rdd。RDD。computeOrReadCheckpoint(RDD.scala:323)~[spark-core_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2]位于org。阿帕奇。火花rdd。RDD。迭代器(RDD.scala:287)~[spark-core_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2]。阿帕奇。火花调度程序。结果任务。runTask(ResultTask.scala:87)~[spark-core2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2]。阿帕奇。火花调度程序。任务在org上运行(Task.scala:108)~[spark-core_2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2]。阿帕奇。火花遗嘱执行人。执行者$TaskRunner。在java上运行(Executor.scala:338)~[spark-core2.11-2.2.0.cloudera2.jar:2.2.0.cloudera2]。util。同时发生的线程池执行器。java上的runWorker(ThreadPoolExecutor.java:1142)~[na:1.8.0_25]。util。同时发生的线程池执行器$Worker。在java上运行(ThreadPoolExecutor.java:617)~[na:1.8.0_25]。朗。丝线。运行(Thread.java:745)[na:1.8.0_25]

我想知道火花sql是否支持以这种方式加载hive表?

共有2个答案

和嘉澍
2023-03-14

我以各种各样的方式看待这个问题。

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

由于KUDU的安全性问题,Spark可能会使用适用于Impala的JDBC访问KUDU表-过于粗略。您可以对Hive使用IMPALA方法,但为什么要这样做呢?

郁承运
2023-03-14

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

  1. 配置spark-env.sh参数以确保Spark使用metastore信息与Hive对话。
  2. 在您的机器中打开Spark-shell。
  3. 在Spark-shell中,使用如下语句
   spark.sql("use <hive_db_name>");
   val df = spark.sql("select count(1) from table");
   df.show();
 类似资料:
  • 我正在尝试从db中选择*。abc在蜂箱中,这个蜂箱表是使用spark加载的 它不工作显示错误: 错误:java。伊奥。IOException:java。lang.IllegalArgumentException:bucketId超出范围:-1(状态=,代码=0) 当我使用以下属性时,我能够查询配置单元: 现在,当我尝试读取相同的hive表db.abc使用火花,我收到的错误如下: 客户端只有在具有以

  • 我们可以使用以下命令轻松地从 Spark 中的 Hive 表中读取记录: 但是当我连接两个表时,例如: 如何从上面的连接查询中检索记录?

  • 我有一个140亿记录的Hive表(大约1TB大小)和另一个8亿记录的Hive表(2GB大)。我想加入它们,我的策略应该是什么?我有一个36节点集群。我使用50个执行器,每个执行器30 GB。 据我所知,我的选择是: 广播2 GB表 只是盲目地连接2个表(我已经这样做了,需要将近4个小时才能完成) 如果我将两个表重新分区并连接起来,会提高性能吗?我观察到在第二种方法中,最后20个任务非常慢,我希望它

  • 问题内容: 是否可以将数据从Microsoft Sql Server(以及oracle,mysql等)读取到Spark应用程序中的rdd中?还是我们需要创建一个内存中的集合并将其并行化为RDD? 问题答案: 从邮件列表中找到了解决方案。可以使用JdbcRDD完成此操作。我需要获取MS Sql Server JDBC驱动程序jar并将其添加到项目的lib中。我想使用集成安全性,因此需要将sqljdb

  • 使用与hive 2.2.0集成的Spark2.3thriftserver。从火花直线运行。尝试将数据插入配置单元hbase表(以hbase作为存储的配置单元表)。插入到配置单元本机表是可以的。当插入到配置单元hbase表时,它会引发以下异常:

  • 我在尝试使用Spark简单读取CSV文件时遇到了这个问题。在这样的操作之后,我想确保: 数据类型是正确的(使用提供的模式) 根据提供的架构,标头是正确的 这是我使用的代码,并且有问题: 类型为产品类型,即案例类。这是可行的,但它不会检查列名是否正确,因此我可以提供另一个文件,只要数据类型正确,就不会发生错误,而且我不知道用户提供了错误的文件,但由于某种程度上的巧合,正确的数据类型具有正确的顺序。