Получение имени таблицы из фрейма данных Spark - PullRequest
0 голосов
/ 27 сентября 2018

Если у меня есть фрейм данных, созданный следующим образом:

df = spark.table("tblName")

Есть ли способ вернуть tblName из df?

Ответы [ 3 ]

0 голосов
/ 27 сентября 2018

Вы можете использовать explain для получения физического плана, который даст вам информацию, которую вы можете использовать для получения исходного имени таблицы,

scala> val df = sqlContext.table("testtable") 
df: org.apache.spark.sql.DataFrame = [id: bigint, name: string, ssn: string]

scala> df.explain

== Physical Plan ==
Scan ParquetRelation: default.testtable[id#0L,name#1,ssn#2] InputPaths: hdfs://user/hive/warehouse/testtable

или

== Physical Plan ==
HiveTableScan [id#0L,name#1,ssn#2], MetastoreRelation hive_sample_db, testtable, None

один разу вас есть физический план в виде строки, достаточно просто манипулировать им, чтобы вернуть исходное имя таблицы.

0 голосов
/ 05 марта 2019

Вы можете извлечь его из плана:

df.logicalPlan().argString().replace("`","")
0 голосов
/ 27 сентября 2018

Вы можете создать таблицу из DF.Но если таблица является локальным временным представлением или глобальным временным представлением, вы должны удалить ее (sqlContext.dropTempTable) перед созданием таблицы с тем же именем или использовать функцию create или replace (spark.createOrReplaceGlobalTempView или spark.createOrReplaceTempView).Если таблица является временной таблицей, вы можете создать таблицу с тем же именем без ошибки

#Create data frame
>>> d = [('Alice', 1)]
>>> test_df = spark.createDataFrame(sc.parallelize(d), ['name','age'])
>>> test_df.show()
+-----+---+
| name|age|
+-----+---+
|Alice|  1|
+-----+---+

#create tables
>>> test_df.createTempView("tbl1")
>>> test_df.registerTempTable("tbl2")
>>> sqlContext.tables().show()
+--------+---------+-----------+
|database|tableName|isTemporary|
+--------+---------+-----------+
|        |     tbl1|       true|
|        |     tbl2|       true|
+--------+---------+-----------+

#create data frame from tbl1
>>> df = spark.table("tbl1")
>>> df.show()
+-----+---+
| name|age|
+-----+---+
|Alice|  1|
+-----+---+

#create tbl1 again with using df data frame. It will get error
>>> df.createTempView("tbl1")
    raise AnalysisException(s.split(': ', 1)[1], stackTrace)
pyspark.sql.utils.AnalysisException: "Temporary view 'tbl1' already exists;"

#drop and create again
>>> sqlContext.dropTempTable('tbl1')
>>> df.createTempView("tbl1")
>>> spark.sql('select * from tbl1').show()
+-----+---+
| name|age|
+-----+---+
|Alice|  1|
+-----+---+


#create data frame from tbl2 and replace name value
>>> df = spark.table("tbl2")
>>> df = df.replace('Alice', 'Bob')
>>> df.show()
+----+---+
|name|age|
+----+---+
| Bob|  1|
+----+---+

#create tbl2 again with using df data frame
>>> df.registerTempTable("tbl2")
>>> spark.sql('select * from tbl2').show()
+----+---+
|name|age|
+----+---+
| Bob|  1|
+----+---+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...