在Spark中获取Hive表的HDFS位置

时间:2019-06-17 23:05:15

标签: scala apache-spark hive apache-spark-sql hiveql

我正在尝试使用以下查询从Spark的Hive分区表中解析出位置:

val dsc_table = spark.sql("DESCRIBE FORMATTED data_db.part_table")

我无法在Spark中找到任何查询或任何其他方式来专门从该查询中选择位置列。

4 个答案:

答案 0 :(得分:2)

您可以使用spark的表格读取实用程序:

spark.read.table("myDB.myTable").select(input_file_name).take(1) 会产生类似以下的字符串:

19/06/18 09:59:55 WARN util.Utils: Truncated the string representation of a plan since it was too large. This behavior can be adjusted by setting 'spark.debug.maxToStringFields' in SparkEnv.conf.
res1: Array[org.apache.spark.sql.Row] = Array([hdfs://nameservice1/my/path/to/table/store/part-00000-d439163c-9fc4-4768-8b0b-c963f5f7d3d2.snappy.parquet])

我只用take(1)打印一行以在此处显示结果。如果需要所有位置,则可能不想使用它。 根据此结果,可以在只需要位置部分的情况下相应地解析字符串。

答案 1 :(得分:1)

数据框API中的

df.inputFiles方法将打印文件路径。 它返回组成此DataFrame的文件的尽力而为快照。

spark.read.table("DB.TableName").inputFiles
Array[String]: = Array(hdfs://test/warehouse/tablename)

答案 2 :(得分:1)

您还可以在.toDF上使用 desc formatted table 方法,然后从数据框中过滤。

DataframeAPI:

scala> :paste
spark.sql("desc formatted data_db.part_table")
.toDF //convert to dataframe will have 3 columns col_name,data_type,comment
.filter('col_name === "Location") //filter on colname
.collect()(0)(1)
.toString

Result:

String = hdfs://nn:8020/location/part_table

(or)

RDD Api:

scala> :paste
spark.sql("desc formatted data_db.part_table")
.collect()
.filter(r => r(0).equals("Location")) //filter on r(0) value
.map(r => r(1)) //get only the location
.mkString //convert as string
.split("8020")(1) //change the split based on your namenode port..etc

Result:

String = /location/part_table

答案 3 :(得分:0)

在Pyspark上找不到答案

table_location = spark.sql("describe formatted DB.TableName").filter((F.col('col_name')=='Location')).select("data_type").toPandas().astype(str)['data_type'].values[0]