Получение HDFS Расположение таблицы Hive в Spark - PullRequest
2 голосов
/ 18 июня 2019

Я пытаюсь проанализировать расположение из многораздельной таблицы Hive в Spark с помощью этого запроса:

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

Мне не удалось найти какой-либо запрос или любой другой способ в Spark, чтобы специально выбрать столбец Location из этого запроса.

Ответы [ 3 ]

2 голосов
/ 18 июня 2019

Вы можете использовать утилиту 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 голос
/ 18 июня 2019

Вы также можете использовать метод .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
1 голос
/ 18 июня 2019

Метод df.inputFiles в API Dataframe выведет путь к файлу.Он возвращает лучший моментальный снимок файлов, составляющих этот DataFrame.

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