如何即时将表名解析为 Parquet?

Posted

技术标签:

【中文标题】如何即时将表名解析为 Parquet?【英文标题】:How can I resolve table names to Parquet on the fly? 【发布时间】:2017-03-17 20:49:11 【问题描述】:

我需要使用我自己的自定义对应关系运行 Spark SQL 查询,从表名到 Parquet 数据。使用sqlContext.read.parquet 将 Parquet 数据读取到 DataFrames 并使用 df.registerTempTable 注册 DataFrames 并不能满足我的用例,因为这些调用必须在 SQL 查询之前运行,而我什至可能不知道需要哪些表。

我没有使用registerTempTable,而是尝试编写一个Analyzer,它使用我自己的逻辑来解析表名。但是,我需要能够将 UnresolvedRelation 解析为代表 Parquet 数据的 LogicalPlan,但 sqlContext.read.parquet 给出的是 DataFrame,而不是 LogicalPlan

DataFrame 似乎有一个logicalPlan 属性,但它被标记为protected[sql]。还有一个ParquetRelation 类,但那是private[sql]。这就是我找到的获得LogicalPlan 的所有方法。

如何使用我自己的逻辑将表名解析为 Parquet?我在使用 Analyzer 时是否走在正确的轨道上?

【问题讨论】:

【参考方案1】:

您实际上可以使用

检索 DataFrame 的 logicalPlan
val myLogicalPlan: LogicalPlan = myDF.queryExecution.logical

【讨论】:

我在QueryExecution 类上没有看到logicalPlan。你的意思是logical?还是这是版本差异问题? 哦,是的,我的意思是logical。对此感到抱歉。我将编辑我的答案。 这似乎可行,尽管我认为我需要小心我是否使用logicalanalyzed 或任何其他queryExecution 属性。仍然感觉我正在处理比我应该做的更深的细节; QueryExecution 类有一条评论称它为“不是公共类”,尽管它没有标记为 private 或任何东西。

以上是关于如何即时将表名解析为 Parquet?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JDBC 接收器连接器将表名转换为大写

存储过程:将表名转换为表变量

如何动态地将表名传递给 PL SQL 游标?

如何将表名和选定字段作为参数传递

将表名和列名定义为 plpgsql 函数中的参数?

clojure jdbc postgres:为啥我的查询结果将表名中的 unicode 字符返回为 �?