在load语句的“inpath”附近需要stringliteral

ruarlubt  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(685)

我对hadoop和hive非常陌生。我正在尝试将数据加载到配置单元表中,遇到下面的错误。
另一方面,我尝试使用语句将记录插入到配置单元表中 stmt.execute("INSERT INTO employee VALUES(1201,'Gopal',45000,'Technical manager')") 它正在成功插入记录,但在加载大量数据时失败。

val filePath=C:\\AllProjects\\xxxxxxx\\src\\main\\resources\\input\\sample.txt
val con = 
DriverManager.getConnection("jdbc:hive2://xxxxxhive.xxxx.com:10000/dehl_dop;principal=hive/xxxxxhive.com.com@internal.xxxxx.com;" +
"mapred.job.queue.name=usa;AuthMech=3;SSL=1;user=zzzz;password=vvvv;" +
"SSLTrustStore=C:\\Program Files\\Java\\jre1.8.0_144\\lib\\security\\hjsecacerts;UseNativeQuery=0")
val stmt = con.createStatement()
print("\n" + "executing the query" +"\n")
stmt.execute(s"load data inpath $filePath into table Employee")

错误

errorMessage:Error while compiling statement: FAILED: ParseException line 1:17 mismatched input 'C' expecting StringLiteral near 'inpath' in load statement), Query: load data inpath C:\xxxxx\xxxxx\xxxxx\xxxxx\xxxxx\xxxxx\sample.txt into table Employee.

任何帮助都将不胜感激

cigdeys3

cigdeys31#

LOAD DATA INPATH 接受字符串文本。 $filePath 需要单引号

stmt.execute(s"load data inpath '$filePath' into table Employee")

但是,该命令要求文件位于hdfs上。你在读你的c盘 LOAD DATA LOCAL INPATH 将读取本地文件系统,但我不确定它在jdbc上是如何工作的,因为它取决于实际执行查询的位置(您的本地计算机或hiveserver)
我建议您在特定的hdfs位置创建一个具有必要模式的外部配置单元表,然后直接将文本文件复制到hdfs。
以编程方式将文件复制到hdfs是一种选择,但是 hadoop fs -put 会更简单。
如果您只想将本地文件加载到hdfs/hive,那么spark比jdbc更有意义

import org.apache.spark.sql.SparkSession

val spark = SparkSession.builder()
    .appName("Sample App").enableHiveSupport().getOrCreate()

val df = spark.read.option("header", "false").csv(filePath)
df.createOrReplaceTempView("emp")
spark.sql("INSERT INTO dehl_dop.Employee SELECT * from emp")

相关问题