我对Hadoop和Hive很陌生。我正在尝试将数据加载到 Hive 表中,但遇到了以下错误。
另一方面,我尝试使用语句将记录插入 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:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxsample.txt into table Employee.
任何帮助将不胜感激
>LOAD DATA INPATH
采用字符串文字。
$filePath
需要用单引号括起来
stmt.execute(s"load data inpath '$filePath' into table Employee")
但是,该命令要求文件位于HDFS上。您正在从 C 盘读取
LOAD DATA LOCAL INPATH
将读取本地文件系统,但我不确定它在 JDBC 上是如何工作的,因为它取决于查询的实际执行位置(您的本地计算机或 HiveServer(
我建议你使用必要的模式在特定 HDFS 位置创建一个外部 Hive 表,然后简单地将文本文件直接复制到 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")