【问题标题】:BigQuery Storage API: Best Practice for Using Client from Spark Pandas UDF?BigQuery 存储 API:使用 Spark Pandas UDF 客户端的最佳实践?
【发布时间】:2020-04-05 00:12:15
【问题描述】:

我有一个 spark 脚本,需要为每一行进行 60 次 api 调用。目前我正在使用 BigQuery 作为数据仓库。我想知道是否有一种方法可以使用BigQuery APIBigQuery Storage API 从我的udf 查询数据库?也许是一种执行批量查询的方法? pandas-gbq 会是更好的解决方案吗?我需要对每行进行的每个查询都是 select count(*) from dataset.table where {...} 查询。

目前我正在使用大查询客户端,如下面的代码 sn-p 所示,但我不确定这是否是利用我的资源的最佳方式。如果此用例的代码没有正确完成,我深表歉意,我是 spark 和 BigQuery 的新手。

def clients():
    os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = '/home/hadoop/credentials.json'
    credentials, your_project_id = google.auth.default(
        scopes=["https://www.googleapis.com/auth/cloud-platform"]
    )

    # Make clients.
    bqclient = bigquery.Client(
        credentials=credentials,
        project=your_project_id,
    )
    bqstorageclient = bigquery_storage_v1beta1.BigQueryStorageClient(
        credentials=credentials
    )
    return bqclient, bqstorageclient

def query_cache(query):
    bqclient, bqstorageclient = clients()

        dataframe = (
            bqclient.query(query)
                .result()
                .to_dataframe(bqstorage_client=bqstorageclient)
        )
        return dataframe['f0_'][0]

@pandas_udf(schema(), PandasUDFType.GROUPED_MAP)
def calc_counts(df):
    query = "select count(*) from dataset.table where ...{some column filters}..."
    df['count'] = df.apply(query_cache, args=(query), axis=1)

【问题讨论】:

    标签: apache-spark pyspark google-bigquery


    【解决方案1】:

    更简单的选择是使用spark-bigquery-connector,它可以让您直接查询 BigQuery 并以 Spark 数据帧的形式获取结果。将这个数据框转换成 pandas 就很简单了:

    spark_df = spark.read.format('bigquery').option('table', table).load()
    pandas_df = spark_df.toPandas()
    

    【讨论】:

    • 谢谢!如果我不使用pandas_udf,我认为这个解决方案效果最好。目前,由于 pandas_udf 无法使用 spark 上下文,因此我必须从驱动程序进行此调用,然后尝试从 udf 函数访问该数据帧。我认为这可能会导致一些内存问题如果我尝试将 df 序列化为 rdd 映射并将其发送/广播到 udf
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    • 2021-05-12
    • 2021-06-25
    相关资源
    最近更新 更多