最近執行pyspark時,直接讀取hive里面的數據,經常遇到幾個問題:
1. java.io.IOException: Not a file —— 然而事實上文件是存在的,是 hdfs 的默認路徑出了錯,需要配置 --files 和 --conf。
2. pyspark.sql.utils.AnalysisException: 'Table or view not found —— 事實上在hive里面是存在這個表的,但是卻顯示找不到。
3. org.apache.spark.sql.catalyst.analysis.NoSuchDatabaseException: Database 'XXXXX' not found; —— 直接顯示數據庫找不到,是因為沒有配置enableHiveSupport(),例如需要設置:spark = SparkSession.builder.master("local").appName("SparkOnHive").enableHiveSupport().getOrCreate()
出現這些問題的原因:
在我這里測試的是:hive配置以及spark-submit提交作業時,參數未設置造成。
# 以下測試通過 import os # from pyspark import SparkContext, SparkConf from pyspark.sql.session import SparkSession from pyspark.sql import HiveContext import sys os.environ["PYSPARK_PYTHON"]="/usr/bin/python3" spark = SparkSession.builder.master("local").appName("SparkOnHive").enableHiveSupport().getOrCreate() #必須配置 enableHiveSupport hive_text = HiveContext(spark) print(sys.getdefaultencoding()) hive_text.sql('use default') #選擇數據庫名 data_2 = hive_text.sql("select * from word_test") #執行查詢語句 #data_2 = hive_text.sql("select * from test_table_words") data_3 = data_2.select("first_column_name").collect() #選擇表中的某一列,或某幾列,需要輸入列名 print(data_3[0][0]) print(data_2.collect()[0]) print(data_2.collect()[0][0]) print("------ finished ------")
以上代碼保存為:test.py
在命令行或者shell執行時,需要使用:
spark-submit --files /opt/spark/spark-2.1.1-bin-hadoop2.7/conf/hive-site.xml --conf spark.hadoop.mapreduce.input.fileinputformat.input.dir.recursive=true test.py
其中:
--files:用於添加hive配置文件,首先注意的是:你的hadoop、spark、hive等都是安裝配置好的,建議安裝spark_with_hive之類已經編譯好的spark。
--conf:一個關鍵配置,這個配置還在學習中
在上述方法執行成功后,第二次執行時發現:spark-submit --files /opt/spark/spark-2.1.1-bin-hadoop2.7/conf/hive-site.xml test.py 也可以直接執行了,有點懵,可能在hive-site.xml中設置了--conf,還在繼續學習中。
注意:此時並不需要在代碼里面設置spark.sql.warehouse.dir:config("spark.sql.warehouse.dir", some_path)