我正在尝试从Spark中的地图操作查询Hive表,但是当它运行查询时执行被冻结。
这是我的测试代码
val sc = new SparkContext(conf)
val datasetPath = "npiCodesMin.csv"
val sparkSession = SparkSession.builder().enableHiveSupport().getOrCreate()
val df = sparkSession.read.option("header", true).option("sep", ",").csv(datasetPath)
df.createOrReplaceTempView("npicodesTmp")
sparkSession.sql("DROP TABLE IF EXISTS npicodes");
sparkSession.sql("CREATE TABLE npicodes AS SELECT * FROM npicodesTmp");
val res = sparkSession.sql("SELECT * FROM npicodes WHERE NPI = '1588667638'") //This works
println(res.first())
val NPIs = sc.parallelize(List("1679576722", "1588667638", "1306849450", "1932102084"))//Some existing NPIs
val rows = NPIs.mapPartitions{ partition =>
val sparkSession = SparkSession.builder().enableHiveSupport().getOrCreate()
partition.map{code =>
val res = sparkSession.sql("SELECT * FROM npicodes WHERE NPI = '"+code+"'")//The program stops here
res.first()
}
}
rows.collect().foreach(println)
它从CSV加载数据,创建一个新的Hive表并用CSV数据填充它。 然后,如果我从主查询表中它完美地工作,但如果我尝试在地图操作中执行该操作,则执行将被冻结。 它不会产生任何错误,它会继续运行而不会做任何事情。
实际上,我不确定我是否可以以分布式方式查询表,我在文档中找不到它。 有什么建议吗?
感谢。