期望 load 语句中的字符串文本接近 'inpath'



我对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")

相关内容

  • 没有找到相关文章

最新更新