카테고리 없음

어떻게 사용자 정의 객체를 데이터셋에 저장할 수 있을까요?

스택큐힙리스트 2023. 12. 3. 00:03
반응형

다음의 Spark Datasets 소개에 따르면:



Spark 2.0을 기대하며, Datasets에 대한 일부 흥미로운 개선 사항을 계획하고 있습니다. 특히:
...
사용자 정의 인코더 - 현재 다양한 유형의 자동 생성 인코더를 사용하지만, 사용자 정의 객체에 대한 API를 공개하고자 합니다.



또한 Dataset에 사용자 정의 유형을 저장하려고 시도하면 다음과 같은 오류가 발생합니다:



Dataset에 저장된 유형에 대한 인코더를 찾을 수 없습니다. 기본 유형 (Int, String 등) 및 제품 유형 (case 클래스)은 sqlContext.implicits._를 가져와서 지원됩니다. 다른 유형에 대한 직렬화 지원은 향후 릴리스에서 추가될 예정입니다.



또는:



Java.lang.UnsupportedOperationException: ....에 대한 인코더가 없습니다.



기존의 해결책은 있나요?

이 질문은 커뮤니티 위키 답변의 진입점으로 존재합니다. 질문과 답변 모두 업데이트/개선하실 수 있습니다.

답변 1

다음은 모든 것을 좀 해보는 예제입니다: MyObj라는 클래스가 있습니다. 이 클래스에는 Int, java.util.UUIDSet[String] 유형의 필드가 있습니다. 첫 번째는 그 자체로 처리됩니다. 두 번째는 kryo를 사용하여 직렬화 할 수 있지만 String으로 저장하는 것이 더 유용할 것입니다(UUID는 보통 저와 결합하고 싶어할 것입니다). 세 번째는 실제로 바이너리 열로 저장되어야 합니다.


class MyObj(val i: Int, val u: java.util.UUID, val s: Set[String])
// 변환을 위한 유형에 대한 별칭
type MyObjEncoded = (Int, String, Set[String])
// 암시적 변환
implicit def toEncoded(o: MyObj): MyObjEncoded = (o.i, o.u.toString, o.s)
implicit def fromEncoded(e: MyObjEncoded): MyObj =
new MyObj(e._1, java.util.UUID.fromString(e._2), e._3)

이제 이 기계를 사용하여 좋은 스키마로 데이터 세트를 만들 수 있습니다:

val d = spark.createDataset(Seq[MyObjEncoded](
new MyObj(1, java.util.UUID.randomUUID, Set(foo)),
new MyObj(2, java.util.UUID.randomUUID, Set(bar))
)).toDF(i,u,s).as[MyObjEncoded]

그리고 스키마는 저에게 올바른 이름을 가진 i열과 u열을 보여주며, 두 열 모두로 조인할 수 있습니다.


d.printSchema
// root
// |-- i: integer (nullable = false)
// |-- u: string (nullable = true)
// |-- s: binary (nullable = true)

답변 2

Dataset에 사용자 정의 객체를 저장하는 방법을 알아봅시다. 이 기사에서는 데이터셋에 사용자 정의 객체를 저장하는 방법에 대해 알려드릴 것입니다. 사용자 정의 객체를 데이터셋에 저장하는 것은 매우 유용한 기능입니다. 이를 통해 복잡한 데이터 구조를 저장하고 조회할 수 있으며, 추후에 필요한 경우 데이터셋에서 객체를 검색하고 수정할 수도 있습니다.
사용자 정의 객체를 데이터셋에 저장하기 위해선 몇 가지 단계를 거쳐야 합니다. 먼저, 사용자 정의 객체를 생성하고 필요한 데이터를 객체에 추가해야 합니다. 이후, 생성한 객체를 데이터셋에 추가하면 됩니다.
데이터셋에 객체를 추가하는 방법은 여러 가지가 있습니다. 가장 일반적인 방법은 객체의 속성을 데이터셋의 칼럼으로 매핑하는 것입니다. 예를 들어, 사용자가 자동차를 나타내는 객체를 저장하고 싶다고 가정해봅시다. 자동차 객체는 제조사, 모델, 가격 등의 속성을 가질 수 있습니다. 이 경우, 데이터셋의 각 칼럼을 객체의 속성과 일치시키고, 그에 맞는 값을 저장하면 됩니다.
자동차 객체를 데이터셋에 추가하기 위해선 다음과 같은 코드를 사용할 수 있습니다:
```
Car car1 = new Car(제조사1, 모델1, 10000);
Car car2 = new Car(제조사2, 모델2, 20000);
Dataset dataset = spark.createDataset(Arrays.asList(car1, car2), Encoders.bean(Car.class));
```
위의 예시에서는 Car 객체를 생성하고, 생성한 객체를 데이터셋에 추가했습니다. `spark.createDataset` 메소드는 객체 리스트와 객체 클래스를 인자로 받아서, 데이터셋을 생성합니다. `Encoders.bean(Car.class)`는 Car 클래스를 위한 인코더를 생성하는 역할을 합니다.
이렇게 생성한 데이터셋을 활용하여 필요한 조회 및 수정 작업을 수행할 수 있습니다. 예를 들어, 가격이 15000 이상인 자동차를 찾고 싶다면 다음과 같은 코드를 사용할 수 있습니다:
```
Dataset filteredCars = dataset.filter(price >= 15000);
```
위의 코드는 데이터셋에서 가격이 15000 이상인 자동차만을 필터링하여 새로운 데이터셋을 생성합니다.
마지막으로, 데이터셋에 저장된 객체를 수정하기 위해서도 일련의 작업을 거쳐야 합니다. 수정을 원하는 객체를 조회한 후, 해당 객체의 속성 값을 변경하고, 변경된 객체를 다시 데이터셋에 저장하면 됩니다.
이처럼 데이터셋에 사용자 정의 객체를 저장하는 방법은 매우 유용하며, 데이터의 복잡성에 상관없이 일관되고 효율적인 데이터 관리를 돕습니다. 데이터셋을 활용하면 객체 지향 프로그래밍의 이점을 최대한 활용할 수 있으며, 데이터 사이언스 및 분석 작업에 필요한 다양한 기능을 제공합니다. 이를 통해 데이터 처리 및 관리 작업을 더욱 간편하게 수행할 수 있습니다.

반응형