Inf*_*eek 6 hadoop hive apache-spark parquet apache-spark-sql
我在嵌入式本地模式下使用Apache Spark.我的所有依赖项都包含在我的pom.xml和相同的版本中(spark-core_2.10,spark-sql_2.10和spark-hive_2.10).
我只想运行一个HiveQL查询来创建一个表(存储为Parquet).
运行以下(相当简单的)代码:
public class App {
public static void main(String[] args) throws IOException, ClassNotFoundException {
SparkConf sparkConf = new SparkConf().setAppName("JavaSparkSQL").setMaster("local[2]").set("spark.executor.memory", "1g");
JavaSparkContext ctx = new JavaSparkContext(sparkConf);
HiveContext sqlContext = new org.apache.spark.sql.hive.HiveContext(ctx.sc());
String createQuery = "CREATE TABLE IF NOT EXISTS Test (id int, name string) STORED AS PARQUET";
sqlContext.sql(createQuery);
}
}
Run Code Online (Sandbox Code Playgroud)
...正在返回以下异常:
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:file:/user/hive/warehouse/test is not a directory or unable to create one)
Run Code Online (Sandbox Code Playgroud)
我可以看到metastore_db在项目的根目录中创建的文件夹.
我四处搜索,找到的解决方案没有帮助 - 其中大部分都不适用于嵌入式模式.
sqlContext.sql("SET hive.metastore.warehouse.dir=hdfs://localhost:9000/user/hive/warehouse");.我现在用完了想法,有人可以提供任何其他建议吗?
为了防止将来有人帮助其他人,我正在尝试针对使用HiveContext的Spark代码编写一些单元测试.我发现为了更改为测试编写文件的路径,我需要调用hiveContext.setConf.我也尝试了与OP相同的方法,执行SET查询,但这不起作用.以下似乎工作!
hive.setConf("hive.metastore.warehouse.dir",
"file:///custom/path/to/hive/warehouse")
Run Code Online (Sandbox Code Playgroud)
为了使这更有用,我特意将此路径设置为我的代码可以访问的位置:
hive.setConf("hive.metastore.warehouse.dir",
getClass.getResource(".").toString)
Run Code Online (Sandbox Code Playgroud)
有了这个,我已经能够使用hive查询和Spark API编写针对我的代码的单元测试.
由于您在本地嵌入模式下运行,因此不考虑HDFS.这就是错误说file:/user/hive/warehouse/test而不是hdfs://localhost:9000/user/hive/warehouse/test.它希望/user/hive/warehouse/test存在于您的本地计算机上.尝试在本地创建它.
| 归档时间: |
|
| 查看次数: |
3829 次 |
| 最近记录: |