initSerDe中的错误:java.lang.ClassNotFoundException类未找到org.apache.hive.hcatalog.data.JsonSerDe

时间:2019-06-10 21:34:35

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

我正在尝试使用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)

配置单元表存储为

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'

我希望从配置单元表中读取数据并将其存储在Dataframe中。

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

应该工作

2 个答案:

答案 0 :(得分:0)

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

源文件来自配置单元lib目录hive-hcatalog-core-3.1.2.jar,将其复制到spark目录下的jars

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

答案 1 :(得分:0)

如下添加需要的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