2017-09-25 1 views
1

I 이개월 마루 파일 2017_01.parquet2017_08.parquet 그 스키마가 있습니다사용 스파크 SQL은 마루 형식으로 존재하지 않는 열을 읽어

2017_01.parquet :

root 
|-- value: struct (nullable = true) 
| |-- version: struct (nullable = true) 
| | |-- major: integer (nullable = true) 
| | |-- minor: integer (nullable = true) 
| |-- guid: string (nullable = true) 

2017_08.parquet :

root 
|-- value: struct (nullable = true) 
| |-- version: struct (nullable = true) 
| | |-- major: integer (nullable = true) 
| | |-- minor: integer (nullable = true) 
| | |-- vnum: integer (nullable = true) 
| |-- guid: string (nullable = true) 

내 코드

+-----+-----+----+ 
|major|minor|vnum| 
+-----+-----+----+ 
| 0001| 4610|1315| 
| 0002| 4610|6206| 
| 0003| 4610|6125| 

하지만 parquetFile = spark.read.parquet("/mydata/2017_01.parquet")

SQL 쇼 오류처럼 2017_01.parquet로드하는 경우 :

pyspark.sql.utils.AnalysisException: u'No such struct field vnum in major, minor; line 4 pos 11' 

나는 이유를 알고 내가 2017_08.parquet 쇼를로드

SQL = """ 
SELECT value.version.major, 
     value.version.minor, 
     value.version.vnum 
FROM OUT_TABLE 
LIMIT 10""" 

parquetFile = spark.read.parquet("/mydata/2017_08.parquet") 
parquetFile.createOrReplaceTempView("OUT_TABLE") 
out_osce = spark.sql(SQL) 
out_osce.show() 

2017_01.parquet에 vnum 열이없고 두 개의 slove 솔루션이 있는데 하나는을 사용하고 있습니다. 0 또 다른 하나는 나무 마루 파일을 읽을 때 스키마를 사용하지만 그 방법도 큰 문제가 있습니다. 나는 그것이 문제가 될 것이며, 불운의 vnum이 옵션 열이며, 08이 열을 가지고 있지 않은 경우 여전히

에러 08의 데이터가 필요하지 않은 경우

첫 번째 솔루션은 2017_08.parquet 읽을 필요

두 번째 솔루션은 spark.read.schema(schema).parquet("/mydata/2017_01.parquet")과 같이 읽을 때 스키마가 주어지며, 먼저 스키마를 작성해야하지만 파일이 매우 복잡한 중첩 테이블 인 경우 사용자가 스키마를 작성할 수 없으며 스키마가 업데이트됩니다.

나는 사람이 그 다음 세 번째 솔루션을 물어 싶 읽기 전용 2017_01.parquet 및 출력 등의 : 읽을 때

+-----+-----+----+ 
|major|minor|vnum| 
+-----+-----+----+ 
| 0001| 4600|null| 
| 0002| 4600|null| 
| 0003| 4600|null| 
+0

감사합니다. @himanshuIIITian이 좋습니다. –

답변

0

당신은 단순히 case 문을 사용하거나 병합 할 수 있습니다

parquetFile = spark.read.parquet("") \ 
       .withColumn("vnum", coalesce("vnum")) 

을 문서 도구 :

병합 (e : Column *) : 열

null이 아닌 첫 번째 열을 반환하거나 모든 입력이 인 경우 null을 반환합니다.

파켓 파일에이 필드가 있으면이 필드가 사용됩니다. 그렇지 않으면 nulls가 사용되며 스키마에 새 열이 표시됩니다.

+0

안녕하세요 T. Gawęda는 coalesce ("vnum")를 사용할 때 항상 오류를 표시하므로 lit (" "), 문제는'.withColumn'입니다. 최상위 레벨에 새로운 컬럼을 추가합니다. 스키마를 중첩하면 오른쪽 레벨에 컬럼을 추가 할 수 없습니다. –

관련 문제