반응형
Notice
Recent Posts
Recent Comments
Link
관리 메뉴

지구정복

[Spark] Hive table저장시 parquet 포맷 관련 설정 본문

데이터 엔지니어링 정복/Spark

[Spark] Hive table저장시 parquet 포맷 관련 설정

noohhee 2025. 4. 13. 15:40
728x90
반응형

 

 

spark dataframe을 hive table로 저장하려고 할 때 아래 에러 발생했다.

StreamingQueryException: [STREAM_FAILED] Query [id = 212088e9-127b-408d-84fa-bc47345e6f77, runId = 303af654-dffd-4218-a813-2b270be37aa3] terminated with exception: An exception was raised by the Python Proxy. Return Message: Traceback (most recent call last):
  File "/usr/local/src/miniconda/py38-16/lib/python3.8/site-packages/py4j/clientserver.py", line 617, in _call_proxy
    return_value = getattr(self.pool[obj_id], method)(*params)
  File "/usr/my/current/spark3-client/python/pyspark/sql/utils.py", line 115, in call
    raise e
  File "/usr/my/current/spark3-client/python/pyspark/sql/utils.py", line 112, in call
    self.func(DataFrame(jdf, wrapped_session_jdf), batch_id)
  File "/tmp/ipykernel_1090436/2468742471.py", line 26, in write_to_hive
    df.write.mode("append").partitionBy("part_date").saveAsTable("test.user_info")
  File "/usr/my/current/spark3-client/python/pyspark/sql/readwriter.py", line 1521, in saveAsTable
    self._jwrite.saveAsTable(name)
  File "/usr/local/src/miniconda/py38-16/lib/python3.8/site-packages/py4j/java_gateway.py", line 1322, in __call__
    return_value = get_return_value(
  File "/usr/my/current/spark3-client/python/pyspark/errors/exceptions/captured.py", line 175, in deco
    raise converted from None
pyspark.errors.exceptions.captured.AnalysisException: The format of the existing table spark_catalog.test.user_info is `HiveFileFormat`. It doesn't match the specified format `ParquetDataSourceV2`.

 

 

  • spark.sql.hive.convertMetastoreParquet

spark dataframe을 Hive Parquet 테이블을 처리할 때 Hive의 Parquet 파일 포맷(HiveFileFormat)을 그대로 사용할지, 아니면 Spark의 기본 Parquet 데이터 소스(ParquetDataSourceV2 또는 이전 버전의 Parquet 데이터 소스)를 사용할지를 결정한다.

 

false로 설정하면 Spark는 Hive의 Parquet 파일 포맷(HiveFileFormat)을 사용하여 데이터를 읽고 쓰므로, Hive와의 호환성을 유지합니다.

true로 설정하면 Spark는 자체 Parquet 데이터 소스(ParquetDataSourceV2 또는 ParquetFileFormat)를 사용하여 데이터를 처리합니다. 이 경우 Hive와 Spark 간의 Parquet 파일 형식이 달라 호환성 문제가 발생할 수 있습니다.

 

 

따라서 위 설정값을 false로 바꿔주고 사용한다.

 

 

 

또한 관련있는 설정값이 하나 더 있다.

위 방법대로 했는데도 만약 문제가 발생한다면 아래 설정도 변경을 고려해본다.

 

  • spark.sql.parquet.writeLegacyFormat

이 설정은 Spark가 Parquet 파일을 쓸 때 Parquet 파일의 메타데이터를 어떤 방식으로 저장할지를 결정합니다.

 

true로 설정하면 Spark는 Parquet 파일을 "레거시" 형식으로 저장합니다. 이는 Spark 1.x 및 Hive와의 호환성을 위해 Parquet 파일의 메타데이터를 이전 방식(Parquet 1.8 이전)으로 작성합니다.

false로 설정하면 Spark는 최신 Parquet 메타데이터 형식을 사용합니다. Spark 3.x에서는 기본적으로 Parquet 2.4 이상의 최적화된 메타데이터 형식을 사용하며, 이는 Hive와의 호환성이 떨어질 수 있습니다.

이 설정은 Parquet 파일의 쓰기 동작에만 영향을 미치며, 읽기 동작에는 영향을 주지 않습니다.

 

 

 

첫 번째 설정의 경우 아예 spark3-default.conf 파일에 설정해버린다.

 

 

 

728x90
반응형
Comments