| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- 컴퓨터과학
- 프로그래밍언어
- 디자인패턴
- 인공지능
- 네트워크보안
- 파이썬
- springboot
- 머신러닝
- 컴퓨터공학
- 버전관리
- 프로그래밍
- 자바스크립트
- 데이터분석
- Yes
- 사이버보안
- 컴퓨터비전
- 클라우드컴퓨팅
- 데이터구조
- 소프트웨어공학
- 네트워크
- 빅데이터
- 딥러닝
- 데이터베이스
- 데이터과학
- 웹개발
- 자료구조
- I'm Sorry
- 소프트웨어
- 보안
- 알고리즘
- Today
- Total
스택큐힙리스트
스택 오버플로우: UDF와 함께 여러 열을 처리하면서 발생 본문
저는 DataFrame에 많은 열이있는 str 타입의 데이터가 있으며, 이름을 바꾸거나 더 많은 열을 추가하지 않고 모든 열에 함수를 적용하려고합니다. for-in 루프를 사용하여 withColumn을 실행하는 방법을 시도해 보았지만 (아래 예제 참조), 일반적으로 코드를 실행하면 Stack Overflow가 표시됩니다 (드물게 작동함),이 DataFrame은 전혀 크지 않습니다. 레코드 수는 약 15000 개입니다.
# df은 DataFrame입니다
def lowerCase(string):
return string.strip().lower()
lowerCaseUDF = udf(lowerCase, StringType())
for (columnName, kind) in df.dtypes:
if(kind == string):
df = df.withColumn(columnName, lowerCaseUDF(df[columnName]))
df.select(Tipo_unidad).distinct().show()
완전한 오류가 매우 길기 때문에 일부 줄만 붙여 놓기로 결정했습니다. 그러나 전체 추적 정보는 여기에서 확인하실 수 있습니다.
Py4JJavaError : o516.showString를 호출하는 동안 오류가 발생했습니다. :
org.apache.spark.SparkException : 단계 실패로 인해 작업이 중단되었습니다.:
2.0 단계에서 작업 1이 4 번 실패했습니다. 최근 실패 : worker2.mcbo.mood.com.ve의
2.0 단계에서 작업 1.3이 실패했습니다.:
java.lang.StackOverflowError at
java.io.ObjectInputStream$BlockDataInputStream.readByte(ObjectInputStream.java:2774)
나는 이 문제가 코드가 많은 작업(각 문자열 타입의 열마다 하나씩)을 실행하기 때문에 발생한 것으로 생각되며, 다른 대안이나 잘 못한 것을 보여주실 수 있나요?
답변 1
다음과 같이 시도해보세요:
from pyspark.sql.functions import col, lower, trim
exprs = [
lower(trim(col(c))).alias(c) if t == string else col(c)
for (c, t) in df.dtypes
]
df.select(*exprs)
이 접근 방식은 현재의 솔루션에 비해 두 가지 주요 장점이 있습니다:
- 각 문자열 열마다 하나의 프로젝션(가장 큰 신뢰성이 있을 것으로 생각되는 성장 계보 없음)만 필요하며 SO에 대한 책임을 집니다.
- 데이터를 파이썬으로 전달하지 않고 직접 내부 표현에만 작업합니다(BatchPythonProcessing).
답변 2
스택 오버플로우: 여러 열을 처리하는 동안 발생할 수 있는 문제프로그래머들 사이에서 널리 알려진 스택 오버플로우는 소프트웨어 개발 중에서 종종 발생하는 작은, 그러나 해결이 까다로운 문제이다. 이 문제는 특히 UDF(사용자 정의 함수)를 사용하여 데이터프레임의 여러 열을 처리하려고 할 때 자주 발생한다.
UDF는 판다스 등의 데이터 분석 라이브러리에서 많이 사용되는 기능으로, 사용자가 작성한 함수를 데이터프레임의 각 열에 적용하여 원하는 연산을 수행하는 역할을 한다. 그러나 이러한 UDF를 사용하는 동안에는 시스템의 스택 크기 제한과 같은 제약 사항으로 인해 스택 오버플로우가 발생할 수 있다.
스택 오버플로우는 한정된 스택 메모리 공간을 초과하여 발생한다. 여러 열을 처리하는 UDF는 일반적으로 재귀적인 함수 호출과 함께 작동하기 때문에, 스택의 메모리를 내부적으로 계속 사용하게 된다. 이렇게 계속된 메모리 사용은 스택의 최댓값을 초과하고, 결과적으로 스택 오버플로우가 발생할 수 있는 원인이 된다.
스택 오버플로우는 프로그래밍에서 큰 문제를 일으킬 수 있다. 이 오류가 발생하면 프로그램은 종료되거나 예기치 않은 동작을 할 수 있다. 따라서 여러 열을 처리하는 UDF를 개발하는 프로그래머는 이러한 문제를 주의해야 한다.
이러한 스택 오버플로우 문제를 해결하기 위해서는 몇 가지 방법이 있다. 첫 번째로는 스택 크기를 늘리는 것이다. 일부 시스템에서는 스택 크기를 조정할 수 있는 환경 변수가 있을 수 있다. 이러한 환경 변수를 사용하여 스택의 크기를 증가시킴으로써 스택 오버플로우를 방지할 수 있다.
두 번째로는 재귀 호출을 최소화하는 것이다. 재귀적인 UDF 호출을 피하는 것은 스택 오버플로우를 방지하는 좋은 전략이다. 대신 반복적인 방식으로 코드를 작성하면 재귀 호출을 거의 사용하지 않아 스택 오버플로우의 위험을 줄일 수 있다.
마지막으로는 UDF를 최적화하는 것이다. 효율적인 알고리즘과 데이터 구조를 사용하여 UDF를 최적화함으로써 스택 오버플로우의 발생 가능성을 줄일 수 있다. 이를 위해 다양한 프로그래밍 기법과 최적화 도구를 활용하는 것이 중요하다.
스택 오버플로우는 여러 열을 처리하는 UDF 개발 시에 주의해야 할 중요한 문제이다. 프로그래머는 이러한 문제를 예방하고 해결하기 위해 스택의 크기를 최적화하고 재귀 호출을 피하며, UDF를 최적화하는 방법을 학습해야 한다. 이렇게 함으로써 안정적이고 효율적인 코드를 작성할 수 있으며, 스택 오버플로우의 위험을 최소화할 수 있다.