如何在使用Spark SQL时忽略数据库名称(或使用数据库名称注册表)

时间:2019-07-17 06:45:18

标签: apache-spark hive pyspark apache-spark-sql pyspark-sql

这对于测试非常有用。

例如

  1. 我打算在生产环境的蜂巢表(外部)中查询main.products
  2. 我已经写了一个火花sql查询该表,但是此时该表尚未准备好。
  3. 所以需要自己注册一个临时表。

我计划在某些表不存在时注册一个表。 但是问题是我无法使用数据库名称main注册表。

我想要什么:

  1. sql中的硬编码表名(因为表名在将来不会更改)
  2. 我不想维护两个变量(prod / debug)来构造每个sql。在文件中首选纯SQL。
  3. 我不想自己创建蜂巢表

代码

def ensure_table(spark, tablename, path):
    '''
    ensure table in hive, or register it from path
    '''
    global SPARK_TABLES
    if not SPARK_TABLES:
        SPARK_TABLES = [f'{i.database}.{i.name}'  for i in spark.catalog.listTables()]

    if tablename not in SPARK_TABLES:
        df = spark.read.parquet(path)
        df.registerTempTable(tablename)
    return spark
def do_something(spark):
    ensure_table(spark, 'products': 'hdfs:///data/ods/main/products/')

    sql = '''select product_id, store_id, max(price_guide) price_guide
    from main.products p
    left join main.stores s on s.city_zip = p.area_zip
    where p.is_deleted=0 and p.is_enabled=1

    df = spark.sql(sql)

    #...

看到这一点,我无法注册名为main.products的表(会出错),并且表名products不会在生产中使用。

PS:有许多表格需要执行此操作。

那么,有什么好主意吗?

0 个答案:

没有答案