[SCALA] 스파크 Dataframe 랜덤 UUID는 모든 변환 / 액션 후 변경
SCALA스파크 Dataframe 랜덤 UUID는 모든 변환 / 액션 후 변경
내가 생성 된 UUID를 포함하는 열이있는 스파크 dataframe 있습니다. 그러나, 나는이 dataframe에 대한 작업 또는 변환을 할 때마다, 각 단계에서 UUID를 변경합니다.
내가 한 번만 UUID를 생성하고 UUID가 어떻게 그 후 정적으로 유지.
에 일부 샘플 코드 내 문제는 다음과 같습니다 재 - 생산 :
def process(spark: SparkSession): Unit = {
import spark.implicits._
val sc = spark.sparkContext
val sqlContext = spark.sqlContext
sc.setLogLevel("OFF")
// create dataframe
val df = spark.createDataset(Array(("a", "1"), ("b", "2"), ("c", "3"))).toDF("col1", "col2")
df.createOrReplaceTempView("df")
df.show(false)
// register an UDF that creates a random UUID
val generateUUID = udf(() => UUID.randomUUID().toString)
// generate UUID for new column
val dfWithUuid = df.withColumn("new_uuid", generateUUID())
dfWithUuid.show(false)
dfWithUuid.show(false) // uuid is different
// new transformations also change the uuid
val dfWithUuidWithNewCol = dfWithUuid.withColumn("col3", df.col("col2")+1)
dfWithUuidWithNewCol.show(false)
}
출력은 다음과 같습니다
+----+----+
|col1|col2|
+----+----+
|a |1 |
|b |2 |
|c |3 |
+----+----+
+----+----+------------------------------------+
|col1|col2|new_uuid |
+----+----+------------------------------------+
|a |1 |a414e73b-24b8-4f64-8d21-f0bc56d3d290|
|b |2 |f37935e5-0bfc-4863-b6dc-897662307e0a|
|c |3 |e3aaf655-5a48-45fb-8ab5-22f78cdeaf26|
+----+----+------------------------------------+
+----+----+------------------------------------+
|col1|col2|new_uuid |
+----+----+------------------------------------+
|a |1 |1c6597bf-f257-4e5f-be81-34a0efa0f6be|
|b |2 |6efe4453-29a8-4b7f-9fa1-7982d2670bd6|
|c |3 |2f7ddc1c-3e8c-4118-8e2c-8a6f526bee7e|
+----+----+------------------------------------+
+----+----+------------------------------------+----+
|col1|col2|new_uuid |col3|
+----+----+------------------------------------+----+
|a |1 |00b85af8-711e-4b59-82e1-8d8e59d4c512|2.0 |
|b |2 |94c3f2c6-9234-4fb3-b1c4-273a37171131|3.0 |
|c |3 |1059fff2-b8f9-4cec-907d-ea181d5003a2|4.0 |
+----+----+------------------------------------+----+
UUID를 각 단계에서 다릅니다.
해결법
-
==============================
1.그것은 예상되는 동작입니다. 사용자 정의 함수는 결정적해야 :
그것은 예상되는 동작입니다. 사용자 정의 함수는 결정적해야 :
당신이 비 결정적 함수를 포함하고 출력을 유지하려면 당신은 영구 저장소에 중간 데이터를 작성하고 다시 읽어야한다. 검사 점 또는 캐싱은 몇 가지 간단한 경우에 작동 할 수 있지만 일반적으로 신뢰할 수 없습니다.
상류 과정 (우선 셔플이) 결정되어있는 경우에는 바이트 배열에 씨앗, 변환과 RAND 함수를 사용하고 UUID.nameUUIDFromBytes에 전달을 시도 할 수 있습니다.
참조 : 스칼라에서 임의의 값을 기존 DataFrame에 새 열을 추가하는 방법에 대한
참고 : SPARK-20586 특정 최적화를 비활성화 할 수 있습니다 결정 플래그를 도입,하지만 데이터가 저장되고 집행의 손실이 발생 될 때의 동작 방식이 명확하지 않다.
from https://stackoverflow.com/questions/42960920/spark-dataframe-random-uuid-changes-after-every-transformation-action by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 어떻게 스칼라를 사용하여 스파크 2.1 밀리 초와 타임 스탬프에 밀리 세컨드의 문자열 열을 변환하는? (0) | 2019.11.17 |
---|---|
[SCALA] 황조롱이 함수형 프로그래밍 디자인 패턴의 부가가치는 무엇인가? (스칼라) (0) | 2019.11.17 |
[SCALA] "반환"과 스칼라에서 "시도 - 캐치 마지막으로"블록 평가 (0) | 2019.11.17 |
[SCALA] 익명 함수 대에 의해-name 매개 변수 (0) | 2019.11.17 |
[SCALA] "구조적인 세련미의 매개 변수 유형은 정제 외부에서 정의하는 추상 형식을 참조 할 수 없습니다" (0) | 2019.11.17 |