Pyspark의 다층 중첩 어레이 구조를위한 평평한 기술
복잡한 중첩 구조와 목표를 이해하십시오
빅 데이터를 다룰 때 복잡한 중첩 데이터 유형을 포함하는 데이터 프레임이 종종 발생합니다. 일반적인 시나리오는 유형 배열 구조 (struct (array (struct)))의 구조를 포함하는 열입니다.
뿌리 |- a : 정수 (nullable = true) |- 목록 : 배열 (nullable = true) | |- 요소 : struct (containsNull = true) | | |- b : 정수 (nullable = true) | | |- sub_list : 배열 (nullable = true) | | | |- 요소 : struct (containsNull = true) | | | | |- C : 정수 (nullable = true) | | | | |- foo : String (nullable = true)
우리의 목표는이 멀티 레이어 중첩 구조를 배열 (struct) 형태로 단순화하는 것입니다.
뿌리 |- a : 정수 (nullable = true) |- 목록 : 배열 (nullable = true) | |- 요소 : struct (containsNull = true) | | |- b : 정수 (nullable = true) | | |- C : 정수 (nullable = true) | | |- foo : String (nullable true)
이 평평한 프로세스는 후속 데이터 분석 및 처리에 중요합니다.
전통적인 접근 방식의 도전과 한계
기존의 평평한 방법에는 일반적으로 익스플로잇 기능이 포함되며,이 기능은 배열의 각 요소를 별도의 행으로 확장합니다. 위의 구조의 경우 Exploit을 직접 사용하는 경우 여러 개의 익스플로잇 작업이 필요하고 Groupby 및 Collect_list를 통해 Reggreggate가 발생하여 더 깊은 둥지에 직면하여 매우 복잡하고 비효율적 일 수 있습니다. 예를 들어, 다음 방법은 효과적이지만 복잡한 시나리오에서 유지하는 데 비용이 많이 듭니다.
Pyspark.SQL 가져 오기 Sparksession에서 pyspark.sql.functions import inline, expr, collect_list, struct # DF가 귀하의 데이터 프레임이라고 가정합니다 # df.select ( "a", inline ( "list")) \ # .select (expr ( "*"), inline ( "sub_list") \ # .Drop ( "sub_list") \ # .Groupby ( "A") \ # .Agg (collect_list (struct ( "b", "c", "foo")). 별명 ( "목록"))
이 접근법은 우리가 모든 중첩 레벨을 행 수준으로 "높이"다음 집계를 "상승"해야하며, 이는 예상되는 "상향식"또는 "내 현장"변환 철학에 위배됩니다. 데이터 프레임 행 수를 변경하지 않고 배열 내부에서 직접 작동 할 수있는 솔루션을 선호합니다.
Pyspark 솔루션 : 변환과 평평한 조합
PySpark 3.X는 변환과 같은 고차 기능을 도입하여 복잡한 데이터 유형 (특히 어레이)의 처리 능력을 크게 향상시킵니다. 변형과 평평한 결합으로 위의 문제를 우아하게 해결할 수 있습니다.
변환 함수를 사용하면 배열의 각 요소에 사용자 정의 변환 로직을 적용하고 새 배열을 반환 할 수 있습니다. 다층 둥지와 관련하여 중첩 변환을 사용하여 레이어별로 레이어를 처리 할 수 있습니다.
핵심 논리 :
- 내부 레이어 변환 : 먼저 가장 안쪽의 sub_list를 변환하십시오. sub_list의 각 요소에 대해 (즉, C 및 FOO를 포함하는 구조물)에 대해 외부 구조물의 B 필드와 결합하여 새로운 평평한 구조물을 만듭니다.
- 외부 변환 :이 변환 단계는 배열 (Array (struct)) 구조를 생성합니다.
- 평평한 : 마지막으로 평평한 기능을 사용하여 배열 (Array (struct)) 구조를 단일 어레이 (struct)로 병합하십시오.
샘플 코드 :
먼저, 우리는 시뮬레이션 된 데이터 프레임을 만듭니다.
Pyspark.SQL 가져 오기 Sparksession에서 pyspark.sql.functions import col, transform, 평평한, struct pyspark.sql.types import structtype, structfield, arraytype, integertype, stringtype # Sparksession 초기화 spark = sparksession.builder.appname ( "flattennestedArraystruct"). getorcreate () # 초기 스키마를 정의합니다 inner_struct_schema = structtype ([[ structfield ( "c", integertype (), true), structfield ( "foo", stringtype (), true) ]))) outer_struct_schema = structtype ([[ structfield ( "b", integertype (), true), structfield ( "sub_list", arraytype (inner_struct_schema), true) ]))) df_schema = structType ([ structfield ( "a", integertype (), true), structfield ( "목록", Arraytype (outer_struct_schema), true) ]))) # 샘플 데이터 생성 = [ (1, [ { "b": 10, "sub_list": [{ "c": 100, "foo": "x"}, { "c": 101, "foo": "y"}]}, { "b": 20, "sub_list": [{ "c": 200, "foo": "z"}}} ]), (2, [ { "b": 30, "sub_list": [{ "c": 300, "foo": "w"}]} ]))) ]] df = spark.createdataframe (data, schema = df_schema) df.printschema () df.show (truncate = false) # 평평한 로직 DF_FLATTENED = DF.WITHCOLUMN ( "목록", 단조롭게 하다( 변환( col ( "list"), # 외부 배열 (배열) lambda x : transform ( # 외부 배열의 각 구조 X에서 작동합니다 x.getfield ( "sub_list"), # struct x의 get sub_list (배열) lambda y : struct (x.getfield ( "b"). 별칭 ( "b"), y.getfield ( "c"). alias ( "c"), y.getfield ( "foo"). alias ( "foo")), ),) )) ),) )) df_flattened.printschema () df_flattened.show (truncate = false) # 스파크를 중지합니다 spark.stop ()
코드 구문 분석
- df.withcolumn ( "list", ...) : 평평한 결과를 포함하도록 목록 열을 수정하기로 선택합니다.
- transform (col ( "list"), lambda x : ...) : 이것은 외부 변환입니다. 목록 열의 각 구조 요소 위에 반복되며 x라고합니다. X 유형은 struct (b : int, sub_list : array (struct (c : int, foo : string))입니다.
- transform (x.getfield ( "sub_list"), lambda y : ...) : 이것은 내부 변환입니다. x의 sub_list 필드에서 작용합니다. sub_list는 요소 (struct (c : int, foo : string))의 이름이 y라는 배열입니다.
- struct (x.getfield ( "b"). alias ( "b"), y.getfield ( "c"). alias ( "c"), y.getfield ( "foo"). alias ( "foo")) : 내부 변환 내부에 새로운 구조물을 구축합니다.
- X.GetField ( "B") : OUTER STRUCT X에서 B 필드를 가져옵니다.
- y.getfield ( "C") : 내부 구조물 y에서 C 필드를 가져옵니다.
- y.getfield ( "foo") : 내부 구조물 y에서 foo 필드를 가져옵니다.
- 별명 ( "B"), 별칭 ( "C"), 별명 ( "FOO")이 새로 생성 된 구조장 필드 이름이 올바른지 확인하는 데 사용됩니다. 이 구조물 함수는 sub_list의 각 y 요소에 대해 평평한 구조를 생성합니다. 따라서 내부 변환의 결과는 배열입니다 (struct (b : int, c : int, foo : string)).
- 중간 결과 : 외부 변환은 이러한 모든 배열 (struct)을 수집하므로 최종 출력은 배열입니다 (구조 (b : int, c : int, foo : foo : string)).
- 평평한 (...) : 마지막으로, 평평한 함수는 배열 (Array (struct)) 구조를 단일 배열 (struct (b : int, c : int, foo : string))로 평평하게합니다.
메모 및 모범 사례
- 필드 이름 : getfield () 및 struct ()에 사용 된 필드 이름이 실제 스키마의 이름과 정확히 일치하는지 확인하십시오.
- 널 값 처리 : 변환 함수는 배열에서 빈 요소를 자연스럽게 처리합니다. sub_list가 비어 있으면 내부 변환은 빈 배열을 반환합니다. 목록이 비어 있으면 외부 변환은 빈 배열도 반환합니다. 평평한 손잡이 빈 배열도 안전합니다.
- 성능 : Transform은 Spark Catalyst Optimizer에서 최적화 할 수 있기 때문에 일반적으로 사용자 정의 UDF (사용자 정의 함수)보다 성능이 향상되는 Spark SQL의 내장 고차 기능입니다.
- 가독성 : 중첩 변환은 매우 강력하지만 막힘은 코드의 가독성을 줄일 수 있습니다. 보다 복잡한 시나리오의 경우 변환 로직을 여러 단계로 나누거나 자세한 주석을 추가하는 것을 고려하십시오.
- 유니버설 :이 변형-흡착 된 평평한 패턴은 더 깊은 둥지 구조로 일반화 될 수 있으며 중첩 수준을 증가시킬 수 있습니다.
요약
Pyspark의 변환 및 평평한 기능을 영리하게 결합함으로써 복잡한 다층 중첩 어레이 (struct (array)) 구조를 선언적이고 효율적인 방식으로 프로세스하기 쉬운 배열 (구조) 구조로 평평하게 할 수 있습니다. 이 접근법은 전통적인 익스플로잇 및 Groupby 조합의 복잡성을 피하고 특히 배열 내부의 미세한 변환 요소가 필요한 시나리오에 적합합니다. Spark에서 복잡한 반 구조화 된 데이터를 다룰 때 매우 유용한 트릭입니다.
위 내용은 Pyspark의 다층 중첩 어레이 구조를위한 평평한 기술의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undress AI Tool
무료로 이미지를 벗다

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Stock Market GPT
더 현명한 결정을 위한 AI 기반 투자 연구

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

이 튜토리얼은 PEFT LORA 어댑터를 기본 모델과 효율적으로 병합하여 완전히 독립적 인 모델을 생성하는 방법을 자세히 설명합니다. 이 기사는 변압기를 직접 사용하는 것이 잘못되었음을 지적합니다. Aumodel은 어댑터를로드하고 가중치를 수동으로 병합하고 PEFT 라이브러리에서 MERGE_AND_UNLOAD 방법을 사용하는 올바른 프로세스를 제공합니다. 또한 튜토리얼은 워드 세그먼트를 다루는 것의 중요성을 강조하고 PEFT 버전 호환성 문제 및 솔루션에 대해 설명합니다.

종속성 패키지를 설치하려면 pipinstall-rrequirements.txt를 실행하십시오. 충돌을 피하고, 파일 경로가 올바른지 확인하고 PIP가 업데이트되었는지 확인하고 필요한 경우 설치 동작을 조정하기 위해-no-deps 또는 --user와 같은 옵션을 사용하는 것이 좋습니다.

Python은 Python의 간단하고 강력한 테스트 도구입니다. 설치 후 테스트 파일은 이름 지정 규칙에 따라 자동으로 발견됩니다. 어설 션 테스트를 위해 test_로 시작하여 기능을 작성하고 @pytest.fixture를 사용하여 재사용 가능한 테스트 데이터를 생성하고 pytest.raises를 통해 예외를 확인하고 지정된 테스트 실행 및 여러 명령 줄 옵션을 지원하며 테스트 효율성을 향상시킵니다.

theargparsemoduleisecomedendedway handlecommand-lineargumentsinpython, robustparsing, typevalidation, helpmessages, anderrorhandling; audys.argvforsimplecaseSrequiringMinimalSetup을 제공합니다.

이 기사는 Python과 Numpy의 부동 소수점 수의 부동 소수 계산 정확도의 일반적인 문제를 탐색하는 것을 목표로하며, 근본 원인은 표준 64 비트 플로팅 포인트 수의 표현 제한에 있다고 설명합니다. 더 높은 정확도가 필요한 컴퓨팅 시나리오의 경우,이 기사는 독자가 복잡한 정확도 요구를 해결하기위한 올바른 도구를 선택할 수 있도록 MPMATH, Sympy 및 GMPY와 같은 고정밀 수학 라이브러리의 사용 방법, 기능 및 해당 시나리오를 소개하고 비교합니다.

PYPDF2, PDFPLAMBER 및 FPDF는 Python이 PDF를 처리하기위한 핵심 라이브러리입니다. PYPDF2를 사용하여 PDFREADER를 통해 페이지를 읽고 extract_text ()를 호출하려면 텍스트 추출, 병합, 분할 및 암호화를 수행하십시오. PDFPlumber는 레이아웃 텍스트 추출 및 테이블 인식을 유지하는 데 더 적합하며 TABLE 데이터를 정확하게 캡처하기 위해 Extract_Tables ()를 지원합니다. FPDF (권장 FPDF2)는 PDF를 생성하는 데 사용되며 문서는 add_page (), set_font () 및 cell ()을 통해 구축 및 출력됩니다. pdfs를 병합 할 때 pdfwriter의 append () 메소드는 여러 파일을 통합 할 수 있습니다.

현재 시간을 얻는 것은 DateTime 모듈을 통해 Python에서 구현할 수 있습니다. 1. DateTime.now ()를 사용하여 로컬 현재 시간을 얻으십시오. utcnow () 및 일일 작업은 Datetime.now ()를 형식의 문자열과 결합하여 요구를 충족시킬 수 있습니다.

import@contextManagerFromContextLibandDefineAgeneratorFunctionThatYieldSActlyOnce, whereCodeBeforeYieldActSasEnterAndErandCodeftertyield (바람직하게는) ACTSAS__EXIT __
