在 Spark-Shell (scala) 中,我们导入, org.apache.spark.sql.hive.thriftserver._ 用于以编程方式为特定 Hive 上下文启动 Hive Thrift 服务器,如下所示 HiveThriftServer2.startWithContext(hiveContext) 公开该特定会话的已注册临时表。
我们如何使用 python 来做同样的事情? python上是否有用于导入HiveThriftServer的包/api?任何其他想法/建议表示赞赏。
我们使用 pyspark 来创建数据框
谢谢
拉维·纳拉亚南
您可以使用 py4j java gateway 导入它。以下代码适用于 Spark 2.0.2,可以通过 beeline 查询在 python 脚本中注册的临时表。
from py4j.java_gateway import java_import
java_import(sc._gateway.jvm,"")
spark = SparkSession \
.builder \
.appName(app_name) \
.master(master)\
.enableHiveSupport()\
.config('spark.sql.hive.thriftServer.singleSession', True)\
.getOrCreate()
sc=spark.sparkContext
sc.setLogLevel('INFO')
#Start the Thrift Server using the jvm and passing the same spark session corresponding to pyspark session in the jvm side.
sc._gateway.jvm.org.apache.spark.sql.hive.thriftserver.HiveThriftServer2.startWithContext(spark._jwrapped)
spark.sql('CREATE TABLE myTable')
data_file="path to csv file with data"
dataframe = spark.read.option("header","true").csv(data_file).cache()
dataframe.createOrReplaceTempView("myTempView")
然后去直线检查是否正确启动:
in terminal> $SPARK_HOME/bin/beeline
beeline> !connect jdbc:hive2://localhost:10000
beeline> show tables;
它应该显示在 python 中创建的表和临时表/视图,包括上面的“myTable”和“myTempView”。必须有相同的 Spark 会话才能看到临时视图
(请参阅答案:避免以编程方式使用创建的上下文启动 HiveThriftServer2 。
注意:即使 Thrift 服务器从终端启动并连接到同一个元存储,也可以访问 hive 表,但是无法访问临时视图,因为它们位于 Spark 会话中并且未写入元存储)
对于 Spark 3,可以执行以下操作:
from py4j.java_gateway import java_import
from pyspark.sql import SparkSession
spark = SparkSession.builder.enableHiveSupport().getOrCreate()
sc = spark.sparkContext
java_import(sc._jvm, "org.apache.spark.sql.hive.thriftserver.HiveThriftServer2")
args = sys.argv[1:]
java_args = sc._gateway.new_array(sc._gateway.jvm.java.lang.String, len(args))
for i, arg in enumerate(args):
java_args[i] = arg
sc._jvm.org.apache.spark.sql.hive.thriftserver.HiveThriftServer2.main(java_args)
请注意,
main
类的HiveThriftServer2
方法调用了startWithContext
方法。 (源代码见这里)