복붙노트

[HADOOP] 스파크에서 하이브 파티션 테이블에 데이터 프레임 저장

HADOOP

스파크에서 하이브 파티션 테이블에 데이터 프레임 저장

kafka 주제에서 나오는 데이터 스트림을 하이브 파티션 테이블에 저장하려고합니다. dstream을 데이터 프레임으로 변환하고 하이브 컨텍스트를 만들 수있었습니다. 내 코드는 다음과 같습니다

val hiveContext = new HiveContext(sc)
hiveContext.setConf("hive.exec.dynamic.partition", "true")
hiveContext.setConf("hive.exec.dynamic.partition.mode", "nonstrict")
newdf.registerTempTable("temp") //newdf is my dataframe
newdf.write.mode(SaveMode.Append).format("osv").partitionBy("date").saveAsTable("mytablename")

그러나 클러스터에 앱을 배포하면

Exception in thread "main" java.lang.IllegalArgumentException: Wrong FS: file:/tmp/spark-3f00838b-c5d9-4a9a-9818-11fbb0007076/scratch_hive_2016-10-18_23-18-33_118_769650074381029645-1, expected: hdfs://

일반 테이블로 저장하려고하고 하이브 구성을 주석 처리하면 작동합니다. 그러나 파티션 테이블을 사용하면이 오류가 발생합니다.

또한 데이터 프레임을 임시 테이블로 등록한 다음 해당 테이블을 파티션 테이블에 쓰려고했습니다. 그렇게하면 동일한 오류가 발생했습니다.

누군가 내가 어떻게 해결할 수 있는지 말해 줄 수 있습니까? 감사.

해결법

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

    1.saveAsTable을 사용하면 Spark가 저장하는 기본 위치는 문서를 기반으로 HiveMetastore에 의해 제어됩니다. 다른 옵션은 saveAsParquetFile을 사용하고 경로를 지정한 다음 나중에 하이브 메타 스토어에 해당 경로를 등록하거나 새 DataFrameWriter 인터페이스를 사용하고 경로 옵션 write.format (source) .mode (mode) .options (options) .saveAsTable을 지정하는 것입니다. (tableName)입니다.

    saveAsTable을 사용하면 Spark가 저장하는 기본 위치는 문서를 기반으로 HiveMetastore에 의해 제어됩니다. 다른 옵션은 saveAsParquetFile을 사용하고 경로를 지정한 다음 나중에 하이브 메타 스토어에 해당 경로를 등록하거나 새 DataFrameWriter 인터페이스를 사용하고 경로 옵션 write.format (source) .mode (mode) .options (options) .saveAsTable을 지정하는 것입니다. (tableName)입니다.

  2. ==============================

    2.나는 그것을 알아. spark 앱 코드에서 스크래치 디렉토리 위치를 아래와 같이 선언했으며 작동했습니다.

    나는 그것을 알아. spark 앱 코드에서 스크래치 디렉토리 위치를 아래와 같이 선언했으며 작동했습니다.

    sqlContext.sql("SET hive.exec.scratchdir=<hdfs location>")
    
  3. from https://stackoverflow.com/questions/40122201/storing-a-dataframe-to-a-hive-partition-table-in-spark by cc-by-sa and MIT license