最近执行 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)
来源: http://www.bubuko.com/infodetail-3336864.html