def get_dataframe_tablename(df: pyspark.sql.DataFrame) -> typing.Optional[str]:
"""
If the dataframe was created from an underlying table (e.g. spark.table('dual') or
spark.sql("select * from dual"), this function will return the
fully qualified table name (e.g. `default`.`dual`) as output otherwise it will return None.
Test on: python 3.7, spark 3.0.1, but it should work with Spark >=2.x and python >=3.4 too
Examples:
>>> get_dataframe_tablename(spark.table('dual'))
`default`.`dual`
>>> get_dataframe_tablename(spark.sql("select * from dual"))
`default`.`dual`
It inspects the output of `df.explain()` to determine that the df was created from a table or not
:param df: input dataframe whose underlying table name will be return
:return: table name or None
"""
def _explain(_df: pyspark.sql.DataFrame) -> str:
# df.explain() does not take parameter to accept the out and dump the output on stdout
# by default
import contextlib
import io
with contextlib.redirect_stdout(io.StringIO()) as f:
_df.explain()
f.seek(0) # Rewind stream position
explanation = f.readlines()[1] # Ignore first output line(#Physical Plan...)
return explanation
pattern = re.compile("Scan hive (.+), HiveTableRelation (.+?), (.+)")
output = _explain(df)
match = pattern.search(output)
return match.group(2) if match else None
6条答案
按热度按时间o7jaxewo1#
您可以从计划中提取它:
jogvjijk2#
我们可以通过解析
unresolved logical plan
从 Dataframe 中提取tablename,具体方法如下:6jygbczu3#
以下实用程序函数可能有助于从给定的DataFrame确定表名。
z9zf31ra4#
下面三行代码将给予表和数据库名称
4si2a6ki5#
这个问题有答案了吗?我找到了一个方法,但可能不是最好的。你可以通过检索物理执行计划,然后对它做一些字符串拆分魔术来访问tablename。
假设您有一个来自
database_name.tblName
的表,下面的代码应该可以工作:第一行将以字符串格式返回执行计划,看起来类似于:
之后,您可以运行一些字符串拆分来访问相关信息。第一个字符串拆分将获取
FileScan
的所有元素-您对第二个元素感兴趣,然后是[
之前和之后的元素-这里第一个元素是感兴趣的。k3bvogb16#
您可以从df创建表。但如果表是本地临时视图或全局临时视图,则应在创建同名表之前删除它(sqlContext.dropTempTable),或者使用创建或替换函数(spark.createOrReplaceGlobalTempView或spark.createOrReplaceTempView)。如果表是临时表,则可以创建同名表而不会出错