복붙노트

[HADOOP] SPARK SQL은 지정된 파티션 경로가없는 경우 실패합니다.

HADOOP

SPARK SQL은 지정된 파티션 경로가없는 경우 실패합니다.

EMR에서 Hive Metastore를 사용하고 있습니다. HiveSQL을 통해 수동으로 테이블을 쿼리 할 수 ​​있습니다. 하지만 Spark Job에서 같은 테이블을 사용할 때 입력 경로가 존재하지 않는다고합니다 : s3 : //

s3 : //에서 위의 파티션 경로를 삭제했지만 테이블 수준에서 파티션을 삭제하지 않고 하이브에서 계속 작동합니다. 어쨌든 pyspark에서 작동하지 않습니다.

여기 내 전체 코드가있다.

from pyspark import SparkContext, HiveContext
from pyspark import SQLContext
from pyspark.sql import SparkSession

sc = SparkContext(appName = "test")
sqlContext = SQLContext(sparkContext=sc)
sqlContext.sql("select count(*) from logan_test.salary_csv").show()
print("done..")

하이브 카탈로그 테이블을 사용하기 위해 다음과 같이 작업을 제출했습니다.

spark-submit test.py --files /usr/lib/hive/conf/hive-site.xml

해결법

  1. ==============================

    1.Metastore가 테이블의 파티션을 유지했지만 디렉토리가 누락 된 HDFS와 비슷한 오류가 발생했습니다.

    Metastore가 테이블의 파티션을 유지했지만 디렉토리가 누락 된 HDFS와 비슷한 오류가 발생했습니다.

    s3을 확인하십시오. 누락되었거나 삭제 한 경우 하이브에서 MSCK REPAIR TABLE을 실행해야합니다. 때때로 이것은 작동하지 않으며 실제로 DROP PARTITION이 필요합니다.

    이 속성은 기본적으로 false이지만 SparkConf 객체를 SparkContext에 전달하여 구성 속성을 설정합니다

    from pyspark import SparkConf, SparkContext
    
    conf = SparkConf().setAppName("test").set("spark.sql.hive.verifyPartitionPath", "false"))
    sc = SparkContext(conf = conf)
    

    또는 Spark 2 방법은 SparkSession을 사용하고 있습니다.

    from pyspark.sql import SparkSession
    
    spark = SparkSession.builder \
    ...     .appName("test") \
    ...     .config("spark.sql.hive.verifyPartitionPath", "false") \
    ...     .enableHiveSupport()
    ...     .getOrCreate()
    
  2. from https://stackoverflow.com/questions/47933705/spark-sql-fails-if-there-is-no-specified-partition-path-available by cc-by-sa and MIT license