我正在从.csv文件中获取数据,然后将df注册为TempView。 之后,我尝试将内容从TempView写入Hive表。 但是我收到未找到数据库的错误。但是我确实在蜂巢中有数据库。
下面是代码:
import org.apache.spark.sql.types._
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions.col
object read_data {
def main (args:Array[String]) {
val spark = SparkSession
.builder()
.master("local[*]")
.appName("Spark SQL basic example")
.config("spark.executor.memory", "1g")
.config("hive.metastore.warehouse.dir", "user/hive/warehouse")
.enableHiveSupport()
.getOrCreate()
///val hiveContext = new org.apache.spark.sql.hive.HiveContext(spark);
val customSchema = StructType(Array(
StructField("order_id", IntegerType, true),
StructField("parent_order_uuid", StringType, true),
StructField("company", StringType, true),
StructField("country_id", IntegerType, true)))
val readogp = spark.read.format("csv")
.option("header", "false")
.schema(customSchema)
.load("/home/cloudera/Desktop/ogp_csv.csv")
// readogp.createOrReplaceTempView("OGP_INTL")
val read_country = spark.read.format("csv")
.option("header", "true")
.load("/home/cloudera/Desktop/country.csv")
//read_country.createOrReplaceTempView("Dim_Country")
println("************************************************************************")
val rept = readogp.join(read_country, readogp("country_id") === read_country("country_id"),"inner")
val final_rp = rept.select(col("order_id"), col("country_iso_code_2"))
.groupBy("country_iso_code_2")
.sum("order_id")
.orderBy("country_iso_code_2")
final_rp.createOrReplaceTempView("FINAL_REPORT_OGP")
spark.sql("use ods")
spark.sql("""insert into ods.final_ogp
select * from FINAL_REPORT_OGP""")
}
}
错误日志:
18/10/13 13:01:56 INFO HiveMetaStore: 0: get_database: ods
18/10/13 13:01:56 INFO audit: ugi=cloudera ip=unknown-ip-addr cmd=get_database: ods
18/10/13 13:01:56 WARN ObjectStore: Failed to get database ods, returning NoSuchObjectException
Exception in thread "main" org.apache.spark.sql.catalyst.analysis.NoSuchDatabaseException: Database 'ods' not found;
Hive中确实存在数据库ods,表也存在。我在代码中犯了错误吗?
答案 0 :(得分:0)
我要检查的第一件事是spark conf spark.sql.catalogImplementation
的值,应将其设置为 hive 。
可以在Spark UI中找到(在本地模式下,默认情况下应在http://localhost:4040上可以访问它)。
创建SparkSession时,对enableHiveSupport
的调用会设置上述conf,随后Spark使用HiveCatalog。
如果conf的值是 in-memory ,则使用Spark的in-memory目录。
我看到enableHiveSupport
的以下实现,
def enableHiveSupport(): Builder = synchronized {
if (hiveClassesArePresent) {
config(CATALOG_IMPLEMENTATION.key, "hive")
} else {
throw new IllegalArgumentException(
"Unable to instantiate SparkSession with Hive support because " +
"Hive classes are not found.")
}
}
private[spark] def hiveClassesArePresent: Boolean = {
try {
Utils.classForName(HIVE_SESSION_STATE_BUILDER_CLASS_NAME)
Utils.classForName("org.apache.hadoop.hive.conf.HiveConf")
true
} catch {
case _: ClassNotFoundException | _: NoClassDefFoundError => false
}
}
从以上摘录中,可能是由于驱动程序类路径未正确设置为包含org.apache.hadoop.hive.conf.HiveConf
答案 1 :(得分:0)
该程序当然无法连接到Hive仓库,似乎您输入了错误的仓库路径。请更正路径:“用户/配置单元/仓库” 我认为应该是:“ / user / hive / warehouse ”(绝对路径)
还有另一项检查:如果从Intellij(本身是任何编辑器)运行程序,则会出现此问题。如果是,请在您的项目资源中添加hive-site.xml:/ src / main / resources 另外,您还需要添加jar,例如:Hive JDBC,mySQL连接器(如果是MySQL metastore)。
希望有帮助。