Я написал следующую программу Scala в Eclipse для чтения файла csv из места в HDFS и последующего сохранения этих данных в таблицу куста [я использую песочницу HDP2.4, запущенную на моем VMWare, присутствующем на моем локальном компьютере]:
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.sql.SQLContext
import org.apache.spark.sql.hive.HiveContext
object HDFS2HiveFileRead {
def main(args:Array[String]){
val conf = new SparkConf()
.setAppName("HDFS2HiveFileRead")
.setMaster("local")
val sc = new SparkContext(conf)
val hiveContext = new HiveContext(sc)
println("loading data")
val loadDF = hiveContext.read
.format("com.databricks.spark.csv")
.option("header","true")
.option("delimiter",",")
.load("hdfs://192.168.159.129:8020/employee.csv")
println("data loaded")
loadDF.printSchema()
println("creating table")
loadDF.write.saveAsTable("%s.%s".format( "default" , "tblEmployee2" ))
println("table created")
val selectQuery = "SELECT * FROM default.tblEmployee2"
println("selecting data")
val result = hiveContext.sql(selectQuery)
result.show()}}
Когда я запускаю эту программу из своего Eclipse; с использованием
Запуск от имени -> Приложение Scala
option: Он показывает мне следующие результаты на консоли Eclipse:
Загрузка данных
данные загружены
корень
| - empid: строка (nullable = true)
| - empname: строка (nullable = true)
| - empage: строка (nullable = true)
создание таблицы
17/06/29 13:27:08 INFO CatalystWriteSupport: Инициализированная Parquet WriteSupport со схемой Catalyst: {"type": "struct", "fields": [{"name": "empid", "type": "string" , "nullable": true, "metadata": {}}, {"name": "empname", "type": "string", "nullable": true, "metadata": {}}, {"name" : "empage", "type": "string", "nullable": true, "metadata": {}}]} и соответствующий тип сообщения Parquet: message spark_schema {необязательный двоичный empid (UTF8); необязательное двоичное имя empname (UTF8); необязательный двоичный формат (UTF8); }
таблица создана
выбор данных
+-----+--------+------+
| empid | empname | empage |
+-----+--------+------+
| 1201 | сатиш | 25 |
| 1202 | Кришна | 28 |
| 1203 | Амит | 39 |
| 1204 | javed | 23 |
| 1205 | прудви | 23 |
+-----+--------+------+
17.06.29 13:27:14 ОШИБКА ShutdownHookManager: Исключение при удалении временного каталога Spark: C: \ Users \ cb \ AppData \ Local \ Temp \ spark-c65aa16b-6448-434f-89dc-c318f0797e10 java.io.IOException: Не удалось удалить: C: \ Users \ cb \ AppData \ Local \ Temp \ spark-c65aa16b-6448-434f-89dc-c318f0797e10
Это показывает, что данные csv были загружены из желаемого местоположения HDFS [присутствует в HDP], а таблица с именем tblEmployee2 также была создана в кусте, так как я мог читать и видеть результаты в консоли. Я мог бы даже читать эту таблицу снова и снова, запустив любое искровое задание для чтения данных из этой таблицы.
НО, проблема в том, что как только я перехожу к HDP2.4 через putty и пытаюсь увидеть эту таблицу в улье,
1) Я не мог там увидеть эту таблицу.
2) Я считаю, что этот код создаст управляемую / внутреннюю таблицу в улье, поэтому файл csv, присутствующий в данном месте в HDFS, также должен быть перемещен из своего базового местоположения в местоположение хранилища метаданных улья, чего не происходит?
3) Я также мог видеть создание папки metastore_db в моем Eclipse, означает ли это, что этот tblEmployee2 создается на моем локальном компьютере / компьютере с Windows?
4) Как я могу решить эту проблему и попросить мой код создать таблицу кустов в hdp? Есть ли какая-то конфигурация, которую мне здесь не хватает?
5) Почему я получаю последнюю ошибку при выполнении? Любой быстрый ответ / указатель будет оценен по достоинству.
ОБНОВЛЕНИЕ. Много подумав, когда добавил hiveContext.setConf("hive.metastore.uris","thrift://192.168.159.129:9083")
Код немного переместился, но с некоторыми проблемами, связанными с разрешениями, начали появляться. Теперь я мог видеть эту таблицу [tblEmployee2] в базе данных по умолчанию моего улья, присутствующую в моем VMWare, но она делает это с помощью SparkSQL сама по себе:
17/06/29 22:43:21 WARN HiveContext$$anon$2: Could not persist `default`.`tblEmployee2` in a Hive compatible way. Persisting it into Hive metastore in Spark SQL specific format.
Следовательно, я все еще не могу использовать HiveContext, и мои вышеупомянутые проблемы 2-5 все еще сохраняются.
С уважением, Бхупеш