0

我面临以下问题:

def my_func(table, usr, psswrd):
    from pyspark import SparkContext, SQLContext, HiveContext, SparkConf

    sconf = SparkConf()
    sconf.setAppName('TEST')
    sconf.set("spark.master", "local[2]")

    sc = SparkContext(conf=sconf)
    hctx = HiveContext(sc)

    ## Initialize variables

    df = hctx.read.format("jdbc").options(url=url,
                                          user=usr,
                                          password=psswd,
                                          driver=driver,
                                          dbtable=table).load()
    pd_df = df.toPandas()

    sc.stop()
    return pd_df

这里的问题是 HiveContext 的持久性(即如果我执行 hctx._get_hive_ctx() 它返回 JavaObject id=Id)所以如果我在同一个脚本中多次使用 my_func 它将在第二次失败。我会尝试删除当我停止 SparkContext 时显然没有删除的 HiveContext。

谢谢

4

1 回答 1

1

删除HiveContext是不可能的,因为某些状态在sc.stop()之后仍然存在,这使得它在某些情况下不起作用。

但是,如果这对您可行,您可以有一个解决方法(小心!!这很危险)。每次启动/停止sparkContext时,都必须删除metastore_db。再次,看看它是否适合你。下面是Java代码(在您的情况下,您必须在 Python 中对其进行修改)。

File hiveLocalMetaStorePath = new File("metastore_db");
FileUtils.deleteDirectory(hiveLocalMetaStorePath);

您可以通过以下链接更好地理解它。

https://issues.apache.org/jira/browse/SPARK-10872

https://issues.apache.org/jira/browse/SPARK-11924

于 2018-01-12T11:15:20.933 回答