Spark Scala中如何正确传递HiveContext作为函数参数
解决HiveContext参数传递错误的问题
先帮你捋捋问题出在哪:
- 你第一次写的
test函数把hc的类型定义成了String,但实际传入的是HiveContext实例,类型完全不匹配,肯定会报错。 - 后来改成
def test(hc:HiveContext, fileName:String){}还是报错,大概率是因为没导入HiveContext类,编译器根本识别不了这个类型。
修正步骤&完整代码
- 先在代码顶部导入
HiveContext类,避免重复写全限定名,也让编译器能识别这个类型 - 把
test函数的第一个参数类型正确指定为HiveContext
import org.apache.spark.SparkConf import org.apache.spark.SparkContext import org.apache.spark.sql.hive.HiveContext object Sample { def main(args:Array[String]){ val fileName = "SampleFile.txt" val conf = new SparkConf().setMaster("local").setAppName("LoadToHivePart") conf.set("spark.ui.port","4041") val sc=new SparkContext(conf) val sqlContext = new org.apache.spark.sql.SQLContext(sc) val hc = new HiveContext(sc) // 导入后不用写全限定名,更简洁 hc.setConf("hive.metastore.uris","thrift://127.0.0.1:9083") test(hc,fileName) sc.stop() } // 这里参数类型正确定义为HiveContext def test(hc:HiveContext, fileName: String){ // 你的业务代码... // 比如可以用hc执行HiveQL:hc.sql("SELECT * FROM your_table") } }
额外小提醒
如果你的Spark版本是2.x及以上,官方更推荐用SparkSession替代HiveContext和SQLContext,用法更简洁:
import org.apache.spark.sql.SparkSession val spark = SparkSession.builder() .master("local") .appName("LoadToHivePart") .config("spark.ui.port", "4041") .enableHiveSupport() // 开启Hive支持 .getOrCreate() // 之后直接用spark操作Hive,比如spark.sql("SELECT * FROM your_table")
内容的提问来源于stack exchange,提问作者Ku002
相关产品推荐
相关产品推荐

