【问题标题】:error in initSerDe : java.lang.ClassNotFoundException class org.apache.hive.hcatalog.data.JsonSerDe not foundinitSerDe 中的错误:找不到 java.lang.ClassNotFoundException 类 org.apache.hive.hcatalog.data.JsonSerDe
【发布时间】:2019-10-25 07:01:50
【问题描述】:

我正在尝试使用 spark sql (scala) 从 Hive 表中读取数据,它给我带来了错误

ERROR hive.log: error in initSerDe: java.lang.ClassNotFoundException Class org.apache.hive.hcatalog.data.JsonSerDe not found
java.lang.ClassNotFoundException: Class org.apache.hive.hcatalog.data.JsonSerDe not found
        at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:2255)
        at org.apache.hadoop.hive.metastore.MetaStoreUtils.getDeserializer(MetaStoreUtils.java:392)
        at org.apache.hadoop.hive.ql.metadata.Table.getDeserializerFromMetaStore(Table.java:274)
        at org.apache.hadoop.hive.ql.metadata.Table.getDeserializer(Table.java:256)
        at org.apache.hadoop.hive.ql.metadata.Table.getCols(Table.java:607)
        at org.apache.spark.sql.hive.client.HiveClientImpl$$anonfun$getTableOption$1$$anonfun$apply$7.apply(HiveClientImpl.scala:358)
        at org.apache.spark.sql.hive.client.HiveClientImpl$$anonfun$getTableOption$1$$anonfun$apply$7.apply(HiveClientImpl.scala:355)
        at scala.Option.map(Option.scala:146)

Hive 表存储为

ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.SequenceFileInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat'

我使用 :require /opt/cloudera/parcels/CDH/lib/hive-hcatalog/share/hcatalog/hive-hcatalog-core.jar 添加了 /opt/cloudera/parcels/CDH/lib/hive-hcatalog/share/hcatalog/hive-hcatalog-core.jar 并能够看到已添加到类路径。

我还尝试在 SparkSession.config() 中添加 JAR 文件。他们两个都没有工作。我检查了一些来自 stackoverflow 的答案,这些答案无助于解决我的问题。

CREATE EXTERNAL TABLE `test.record`(
  `test_id` string COMMENT 'from deserializer', 
  `test_name` string COMMENT 'from deserializer', 
  `processed_datetime` timestamp COMMENT 'from deserializer'
  )
PARTITIONED BY ( 
  `filedate` date)
ROW FORMAT SERDE 
  'org.apache.hive.hcatalog.data.JsonSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.SequenceFileInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat'

我希望从 hive 表中读取数据并能够将其存储在 Dataframe 中。

var tempDF =sql("SELECT * FROM test.record WHERE filedate = '2019-06-03' LIMIT 5")
tempDF.show()

应该工作

【问题讨论】:

  • 你也可以发布一个示例数据吗?

标签: scala apache-spark hive apache-spark-sql


【解决方案1】:

解决此问题的一种快速方法是将 jar 文件复制到 spark。

源文件来自hivelib目录hive-hcatalog-core-3.1.2.jar,复制到spark目录下jars

我也尝试在hive-site.xml 中修改hive.aux.jars.path 配置,但它不起作用。如果有人知道 spark 有加载额外 jar 的配置,请发表评论。

【讨论】:

    【解决方案2】:

    按如下方式添加所需的jar,而不是在集群中的所有节点上复制jar:

    1. 在 conf/spark-defaults 中添加以下配置

      spark.driver.extraClassPath /fullpath/hive-hcatalog-core-3.1.2.jar spark.executor.extraClassPath /fullpath/hive-hcatalog-core-3.1.2.jar

    2. 或者在spark-sql中,查询前执行add jar语句: 添加 JAR /fullpath/hive-hcatalog-core-3.1.2.jar

    【讨论】:

      猜你喜欢
      • 2017-12-26
      • 2020-02-13
      • 1970-01-01
      • 2014-11-28
      • 1970-01-01
      • 2021-08-30
      • 2019-05-11
      • 2018-04-04
      • 2019-09-19
      相关资源
      最近更新 更多