我很困惑,如何使用pyspark从hive服务器使用jdbc获取数据。
我正在尝试使用jdbc从pyspark连接到本地计算机上运行的HiveServer2。所有组件HDFS,pyspark,HiveServer2都在同一台机器上。
以下是我用来连接的代码:
connProps={ "username" : 'hive',"password" : '',"driver" : "org.apache.hive.jdbc.HiveDriver"}
sqlContext.read.jdbc(url='jdbc:hive2://127.0.0.1:10000/default',table='pokes',properties=connProps)
dataframe_mysql = sqlContext.read.format("jdbc").option("url", "jdbc:hive://localhost:10000/default").option("driver", "org.apache.hive.jdbc.HiveDriver").option("dbtable", "pokes").option("user", "hive").option("password", "").load()
上面使用的两种方法都给出了与下面相同的错误:
org.apache.spark.sql.AnalysisException:java.lang.RuntimeException: java.lang.RuntimeException:无法实例化 org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient;
javax.jdo.JDOFatalDataStoreException:无法打开测试连接 到给定的数据库。 JDBC url = jdbc:derby :; databaseName = metastore_db; create = true,username = APP。 终止连接池(如果您希望将lazyInit设置为true) 在应用程序之后启动数据库。)
错误XSDB6:Derby的另一个实例可能已经启动了数据库/ home /// jupyter-notebooks / metastore_db
metastore_db位于创建jupyter笔记本的同一目录中。但是hive-site.xml具有不同的Metastore位置。 我已经检查了其他有关同一错误的问题,说其他spark-shell或此类进程正在运行,但事实并非如此。即使我在HiveServer2和HDFS关闭时尝试执行命令,我也会遇到相同的错误
spark.sql("CREATE TABLE IF NOT EXISTS src (key INT, value STRING) USING hive")
我可以使用jdbc使用java程序连接到hives。我在这里错过了什么吗?请帮忙。谢谢。
答案 0 :(得分:0)
Spark不应该使用JDBC连接到Hive。
它从Metastore读取,并跳过HiveServer2
但是,Another instance of Derby may have already booted the database
表示您从另一个会话运行Spark,例如另一个仍在运行的Jupyter内核。尝试设置不同的Metastore位置,或使用本地Mysql或Postgres数据库设置远程Hive Metastore,并使用该信息编辑$SPARK_HOME/conf/hive-site.xml
。
spark = SparkSession \
.builder \
.appName("Python Spark SQL Hive integration example") \
.config("spark.sql.warehouse.dir", warehouse_location) \
.enableHiveSupport() \
.getOrCreate()
# spark is an existing SparkSession
spark.sql("CREATE TABLE...")