如何即时将表名解析为 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
。对此感到抱歉。我将编辑我的答案。
这似乎可行,尽管我认为我需要小心我是否使用logical
、analyzed
或任何其他queryExecution
属性。仍然感觉我正在处理比我应该做的更深的细节; QueryExecution
类有一条评论称它为“不是公共类”,尽管它没有标记为 private
或任何东西。以上是关于如何即时将表名解析为 Parquet?的主要内容,如果未能解决你的问题,请参考以下文章