spark on hive 写入hdfs

本文详细探讨了在使用Scala编写的Spark应用程序中,如何处理Spark on Hive进行数据写入HDFS时遇到的问题。文章深入剖析了错误源头,并提供了具体的解决方案,帮助开发者解决此类问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Exception in thread "main" java.io.IOException: No FileSystem for scheme: http
        at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2795)
        at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2809)
        at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:98)
        at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2852)
        at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2834)
        at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:387)
        at org.apache.hadoop.fs.Path.getFileSystem(Path.java:296)
        at org.apache.spark.SparkHadoopWriter$.createPathFromString(SparkHadoopWriter.scala:170)
        at org.apache.spark.rdd.PairRDDFunctions$$anonfun$saveAsHadoopFile$4.apply$mcV$sp(PairRDDFunctions.scala:1059)
        at org.apache.spark.rdd.PairRDDFunctions$$anonfun$saveAsHadoopFile$4.apply(PairRDDFunctions.scala:1026)
        at org.apache.spark.rdd.PairRDDFunctions$$anonfun$saveAsHadoopFile$4.apply(PairRDDFunctions.scala:1026)
        at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:150)
        at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:111)
        at org.apache.spark.rdd.RDD.withScope(RDD.scala:316)
        at org.apache.spark.rdd.PairRDDFunctions.saveAsHadoopFile(PairRDDFunctions.scala:1026)
        at org.apache.spark.rdd.PairRDDFunctions$$anonfun$saveAsHadoopFile$1.apply$mcV$sp(PairRDDFunctions.scala:952)
        at org.apache.spark.rdd.PairRDDFunctions$$anonfun$saveAsHadoopFile$1.apply(PairRDDFunctions.scala:952)
        at org.apache.spark.rdd.PairRDDFunctions$$anonfun$saveAsHadoopFile$1.apply(PairRDDFunctions.scala:952)
        at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:150)
        at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:111)
        at org.apache.spark.rdd.RDD.withScope(RDD.scala:316)
        at org.apache.spark.rdd.PairRDDFunctions.saveAsHadoopFile(PairRDDFunctions.scala:951)
        at org.apache.spark.rdd.RDD$$anonfun$saveAsTextFile$1.apply$mcV$sp(RDD.scala:1457)
        at org.apache.spark.rdd.RDD$$anonfun$saveAsTextFile$1.apply(RDD.scala:1436)
        at org.apache.spark.rdd.RDD$$anonfun$saveAsTextFile$1.apply(RDD.scala:1436)
        at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:150)
        at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:111)
        at org.apache.spark.rdd.RDD.withScope(RDD.scala:316)
        at org.apache.spark.rdd.RDD.saveAsTextFile(RDD.scala:1436)
        at com.databricks.spark.csv.package$CsvSchemaRDD.saveAsCsvFile(package.scala:179)
        at xiangqi_spark.MysqlImport$.main(MysqlImport.scala:35)
        at xiangqi_spark.MysqlImport.main(MysqlImport.scala)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:730)
        at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:181)
        at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:206)
        at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:121)

        at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)


解决方案:

resultsql.repartition(1).write.format("csv").save("http://192.168.0.118:8020/tmp/"+date+"_2")
改成
resultsql.repartition(1).write.format("csv").save("hdfs://192.168.0.118:8020/tmp/"+date+"_2")
看出不一样的地方没
看出来,打自己吧,那么粗心。。。。



<think>好的,我现在需要处理用户关于Spark on Hive的面试题及答案的请求。首先,我得先理解用户的具体需求。用户之前提到了Hive相关的面试题,现在想找Spark on Hive的相关内容。我需要结合两者的交集部分来生成问题和解答。 接下来,我得回忆一下Spark on Hive的基本概念。SparkHive都是大数据处理工具,Spark可以集成Hive,使用Hive的元数据存储,这样Spark SQL就能直接访问Hive表。这种集成通常称为Spark on Hive,或者SparkHive的集成。 用户可能需要的问题可能涉及配置、优化、数据写、执行过程比较等。比如,如何配置Spark连接HiveSparkHive的区别是什么?性能优化方面有什么要注意的?还有可能涉及Hive on SparkSpark on Hive的区别,这也是常见的混淆点。 然后,我需要参考之前提供的引用内容。比如,引用[3]提到Hive处理时间序列数据时使用分区和列式存储,以及窗口函数。这可能和Spark处理Hive表时的优化有关联,比如在Spark中使用同样的存储格式或者分区策略。 另外,用户提供的示例回答结构包括问题列表和答案,每个答案后可能有代码块或引用。我需要确保生成的答案符合用户指定的格式,比如使用中文,正确使用LaTeX公式(虽然这里可能不太需要),以及添加引用标识。 可能的问题点: 1. Spark如何集成Hive Metastore? 2. Hive表时的优化措施。 3. Spark SQL与Hive SQL的异同。 4. 如何将Spark处理的结果写回Hive? 5. Hive on SparkSpark on Hive的区别。 6. 权限控制,比如Spark访问Hive时的权限设置(可能参考引用[2]中的Hive权限控制)。 7. 处理复杂数据类型时两者的协作(参考引用[3]中的复杂数据类型处理)。 需要确保每个问题的解答准确,并且如果有相关的引用内容,在末尾添加引用标识。例如,当提到Hive的分区优化时,可以引用[3]中的内容。 还要注意用户提到的“系统级指令”,比如数学公式的格式,但问题可能更多涉及配置和概念,可能用不上太多数学公式。不过如果有涉及性能分析的公式,比如时间复杂度,需要用$$...$$格式。 最后,检查生成的问题是否覆盖了用户可能关心的方面,以及答案是否正确、结构清晰,符合用户的要求。</think>### Spark on Hive 面试题及解答 #### 1. **Spark如何集成Hive Metastore?** Spark通过Hive的配置文件(如`hive-site.xml`)来连接Hive Metastore,从而直接访问Hive表。配置步骤如下: 1. 将Hive的`hive-site.xml`文件复制到Spark的`conf`目录。 2. 启动Spark时,指定Hive Metastore的地址(如`spark.sql.hive.metastore.uris`)。 ```scala val spark = SparkSession.builder() .appName("SparkOnHive") .config("spark.sql.hive.metastore.uris", "thrift://hive-metastore-host:9083") .enableHiveSupport() .getOrCreate() ``` 此时,Spark可直接通过`spark.sql("SELECT * FROM hive_table")`查询Hive表[^3]。 --- #### 2. **SparkHive表时有哪些优化方法?** - **分区裁剪**:利用Hive表的分区设计,Spark自动过滤无关分区。例如,查询`WHERE l_date='2023-01-01'`时,仅取对应分区[^3]。 - **列式存储**:若Hive表使用ORC或Parquet格式,Spark可高效取特定列,减少I/O开销。 - **谓词下推**:通过`spark.sql.parquet.filterPushdown true`启用,将过滤条件下推到存储层执行。 --- #### 3. **Spark SQL与Hive SQL的主要区别?** | 特性 | Spark SQL | Hive SQL | |---------------------|-------------------------------|------------------------------| | **执行引擎** | 基于Spark内存计算 | 基于MapReduce或Tez | | **延迟** | 低延迟(毫秒级) | 高延迟(分钟级) | | **容错** | RDD血缘容错 | 依赖外部存储(如HDFS) | | **适用场景** | 迭代计算、实时分析 | 离线批处理 | --- #### 4. **如何将Spark处理的结果写回Hive表?** 通过`DataFrame.write.saveAsTable`方法可直接写入Hive表: ```scala df.write.mode("overwrite").saveAsTable("hive_output_table") ``` 若需动态分区,需启用配置: ```sql SET hive.exec.dynamic.partition=true; SET hive.exec.dynamic.partition.mode=nonstrict; ``` --- #### 5. **Hive on SparkSpark on Hive的区别?** - **Spark on Hive**:Spark作为执行引擎,直接访问Hive元数据(默认模式)。 - **Hive on Spark**:HiveSpark作为底层计算引擎(需配置`hive.execution.engine=spark`),适用于替代MapReduce[^2]。 --- #### 6. **Spark访问Hive表时如何控制权限?** 需依赖Hive的权限机制(如Ranger或Sentry): - 在Hive中配置角色和权限(如`GRANT SELECT ON TABLE test TO user1;`)[^2]。 - Spark需以对应用户身份提交作业,继承Hive权限。 --- #### 7. **Spark如何处理Hive中的复杂数据类型(如ARRAY、MAP)?** Spark支持Hive的复杂数据类型,可直接映射为`ArrayType`、`MapType`: ```scala val df = spark.sql("SELECT id, tags FROM hive_complex_table") df.printSchema() // root // |-- id: int // |-- tags: array<string> ``` 可通过`explode`函数展开数组: ```sql SELECT id, explode(tags) AS tag FROM hive_complex_table ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值