평평하게하려는 데이터 프레임이 있습니다. 프로세스의 일부로 분해하려고합니다. 따라서 배열의 열이있는 경우 배열의 각 값을 사용하여 별도의 행을 만듭니다. 예를 들어,Spark sql null 값을 잃지 않고 폭발하는 방법
id | name | likes
_______________________________
1 | Luke | [baseball, soccer]
는이되어야
id | name | likes
_______________________________
1 | Luke | baseball
1 | Luke | soccer
이 내 코드
private DataFrame explodeDataFrame(DataFrame df) {
DataFrame resultDf = df;
for (StructField field : df.schema().fields()) {
if (field.dataType() instanceof ArrayType) {
resultDf = resultDf.withColumn(field.name(), org.apache.spark.sql.functions.explode(resultDf.col(field.name())));
resultDf.show();
}
}
return resultDf;
}
문제는 내 데이터 배열 열의 일부가 널 (null)을 가지고입니다. 이 경우 전체 행이 삭제됩니다. 그래서이 dataframe :
id | name | likes
_______________________________
1 | Luke | [baseball, soccer]
2 | Lucy | null
이
id | name | likes
_______________________________
1 | Luke | baseball
1 | Luke | soccer
대신
id | name | likes
_______________________________
1 | Luke | baseball
1 | Luke | soccer
2 | Lucy | null
내가 널 행을 잃지 않도록 어떻게 내 배열이 폭발 할 수의이됩니까?
나는 스파크 1.5.2와 자바를 사용하고 8
멋지다, 감사합니다!나는 다음과 같은 질문을 가지고있다. 만약 내 컬럼 타입이 StructType이라면? 캐스트 (새로운 StructType())를 사용하여 시도했지만'데이터 형식 불일치 : THEN 및 ELSE식이 모두 같은 형식이거나 공통 형식과 호환 가능해야합니다. '가능한 한 제네릭을 만들기 위해 노력하고 있습니다. 모든 열 유형에 적합합니다. – alexgbelov
또한 열 유형을 가져 오려면 DataFrame.dtypes()를 사용하고 있습니다. 열 유형을 가져 오는 더 좋은 방법이 있습니까? – alexgbelov
a) 모든 필드와 함께 전체 스키마를 제공해야합니다. b)'dtypes' 또는'schema'. – zero323