如何通过AWS Glue Notebook直接查询SAP HANA
在AWS Glue Notebook中使用SAP HANA JDBC驱动执行自定义查询
可行解决方案
1. 用子查询替代dbtable参数
SAP HANA的NGDBC驱动支持将子查询作为dbtable参数的值,以此实现自定义查询逻辑,避免全表加载。写法如下:
df = glueContext.read.format("jdbc")\ .option("driver", jdbc_driver_name)\ .option("url", db_url)\ .option("dbtable", "(SELECT KUNNR, NAME1, LAND1 FROM KNA1 WHERE LAND1 = 'DE') AS DE_CUSTOMERS")\ .option("user", db_username)\ .option("password", db_password)\ .load()
注意:子查询必须指定别名(示例中的DE_CUSTOMERS),否则驱动会解析失败。这种方式本质是让HANA先执行过滤/聚合逻辑,只返回需要的数据,大幅降低数据传输成本。
2. 开启谓词下推+并行读取
如果需要处理大表,结合pushDownPredicate和分区参数,既能让过滤逻辑在HANA端执行,又能并行读取数据提升效率:
df = glueContext.read.format("jdbc")\ .option("driver", jdbc_driver_name)\ .option("url", db_url)\ .option("dbtable", "KNA1")\ .option("user", db_username)\ .option("password", db_password)\ .option("partitionColumn", "KUNNR")\ .option("lowerBound", "0000000001")\ .option("upperBound", "9999999999")\ .option("numPartitions", 4)\ .option("pushDownPredicate", "true")\ .load() # 后续的过滤逻辑会自动下推到HANA执行 filtered_df = df.filter(df.LAND1 == 'FR')
pushDownPredicate会将DataFrame的过滤条件转换为SQL推送到HANA执行,而非拉取全表后再过滤。选择分布均匀的partitionColumn(比如主键KUNNR)能避免数据倾斜。
3. 重试query参数(部分场景有效)
部分版本的Glue对NGDBC驱动的query参数支持可能存在兼容性问题,可重试确认是否是配置问题:
df = glueContext.read.format("jdbc")\ .option("driver", jdbc_driver_name)\ .option("url", db_url)\ .option("query", "SELECT * FROM KNA1 WHERE ERDAT >= '20240101'")\ .option("user", db_username)\ .option("password", db_password)\ .load()
如果依然无效,优先采用子查询的方案,这是JDBC驱动通用的兼容写法。
内容的提问来源于stack exchange,提问作者jlrolin
相关产品推荐
相关产品推荐

