You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Azure Data Explorer与Databricks连接中的延迟加载及性能问题咨询

解答Databricks与ADX连接的延迟加载及性能问题

我结合ADX和Databricks集成的实战经验,来逐个拆解你的疑问:

1. 该连接方式是否支持延迟加载?

是的,com.microsoft.kusto.spark.datasource连接器支持延迟加载(谓词下推),但你遇到的count操作慢的问题,核心原因是这个操作没有被下推到ADX执行。

ADX本身的count是在服务器端快速计算的,但当你直接对Spark DataFrame执行count()时,如果没有任何过滤或投影操作,部分版本的连接器可能会选择拉取全量数据到Spark集群后再计算count——这就是为什么60万条记录耗时20秒,而ADX本地查询仅需亚秒级。

不过如果是带过滤、聚合的操作(比如df.filter(...).count()),连接器会把这些逻辑转换为Kusto查询下推到ADX执行,只返回计算后的结果,这时候就能体现延迟加载的优势。

2. 如何实现延迟加载,避免全量加载数据?

要实现真正的延迟加载,核心是让Spark的操作尽可能下推到ADX执行,你可以这么做:

  • 优先使用kustoTable而非kustoQuery:当你指定kustoTable参数时,连接器会解析Spark后续的DSL操作(比如filter、select、groupBy),自动转换为对应的Kusto查询发送到ADX,只有当需要返回结果时才会拉取必要的数据。示例:

    df = spark.read.format("com.microsoft.kusto.spark.datasource") \
        .option("kustoCluster", KUSTO_URI) \
        .option("kustoDatabase", KUSTO_DATABASE) \
        .option("kustoTable", "some_table_in_adx") \
        .option("kustoAadAppId", CLIENT_ID) \
        .option("kustoAadAppSecret", CLIENT_SECRET) \
        .option("kustoAadAuthorityID", AAD_TENANT_ID) \
        .load()
    
    # 这个filter会被下推到ADX执行,仅返回符合条件的数据
    filtered_df = df.filter(df["age"] > 30)
    # count操作也会下推,ADX计算后返回结果,速度和ADX本地查询一致
    filtered_df.count()
    
  • 手动下推聚合/查询:如果是固定的聚合操作(比如count),可以直接在kustoQuery里写Kusto原生查询,让ADX直接执行并返回结果:

    df = spark.read.format("com.microsoft.kusto.spark.datasource") \
        .option("kustoCluster", KUSTO_URI) \
        .option("kustoDatabase", KUSTO_DATABASE) \
        .option("kustoQuery", "some_table_in_adx | count") \
        .option("kustoAadAppId", CLIENT_ID) \
        .option("kustoAadAppSecret", CLIENT_SECRET) \
        .option("kustoAadAuthorityID", AAD_TENANT_ID) \
        .load()
    # 此时df仅包含一行count结果,速度极快
    
  • 确保使用最新版本的连接器:旧版本的连接器可能存在下推支持不完善的情况,建议升级到最新的azure-kusto-spark包。

3. 转换为Hive表是复制数据还是虚拟表?

这取决于你使用的方式:

  • CreateOrReplaceTempView:这只是在Spark会话中创建一个临时视图,不会复制任何数据。查询视图时,Spark还是会通过连接器去ADX实时拉取数据(支持下推的话,逻辑会下推到ADX)。

  • saveAsTable:默认会把Spark DataFrame中的数据持久化到Databricks的默认存储(比如DBFS),生成一张物理表——这时候数据是ADX数据的本地副本,不再和ADX实时同步。

  • 创建外部表:如果想要一个指向ADX的“虚拟表”,可以创建Hive外部表,指定Kusto数据源。这样查询表时,会实时从ADX获取数据,不会复制:

    CREATE EXTERNAL TABLE adx_external_table
    USING com.microsoft.kusto.spark.datasource
    OPTIONS (
        kustoCluster '<your-adx-cluster-uri>',
        kustoDatabase '<your-db-name>',
        kustoTable '<your-adx-table-name>',
        kustoAadAppId '<your-client-id>',
        kustoAadAppSecret '<your-client-secret>',
        kustoAadAuthorityID '<your-tenant-id>'
    )
    

内容的提问来源于stack exchange,提问作者Mehdi Sidi Boumedine

火山引擎 最新活动