Apache PySpark의 데이터 프레임: 종합 자습서 [예제 포함]
게시 됨: 2020-02-27오늘 은 Apache PySpark의 DataFrame에 대해 알아보겠습니다. Pyspark는 2020년 최고의 데이터 과학 도구 중 하나입니다. Apache Spark의 분산 행 모음의 열이라고 합니다. Excel Sheets의 테이블 또는 열과 매우 유사하며 관계형 데이터베이스의 테이블과도 유사합니다. PySpark DataFrame에는 다음과 같은 RDD와 유사한 특성도 있습니다.
분산형: DataFrame과 RDD의 특성이 모두 분산됨
지연 평가: 작업이 수행되지 않으면 작업 실행이 수행되지 않습니다.
불변의 성질: RDD/DataFrame의 또 다른 유사한 특징은 한번 생성되면 변경할 수 없다는 것입니다. 그러나 변환을 적용하여 RDD/DataFrame을 변환할 수 있습니다.
목차
DataFrame의 장점
1. Java, Scala, R, Python 등 다양한 언어를 지원하므로 API 지원 측면에서 유용합니다. 여러 언어에 대한 API 지원은 많은 프로그래밍 언어로 작업하는 데 도움이 됩니다.
2. DataFrame은 다양한 데이터 소스와 형식을 지원하므로 다양한 데이터 소스와 형식을 편리하게 사용할 수 있습니다.
3. DataFrame의 가장 좋은 점 중 하나는 페타바이트(Petabytes)의 데이터도 처리할 수 있다는 것입니다. 이는 이러한 방대한 데이터를 처리하는 놀라운 능력입니다.
4. Apache Spark는 Spark DataFrame의 관찰을 통해 DataFrame의 스키마를 빠르게 이해합니다. 명명된 열 아래에는 Spark DataFrame의 관찰이 구성됩니다. 이러한 방식으로 쿼리 실행 계획이 최적화됩니다.
5. 방대한 양의 반정형 및 정형 데이터를 DataFrame으로 처리하도록 설계되었기 때문에 빠르게 처리할 수 있습니다.
아파치 스파크 설정
Apache Spark는 DataFrame 작업에 사용하기 시작하기 전에 머신에 설정되어야 합니다. DataFrame은 다양한 DataFrame 연산을 지원하므로 DataFrame을 지원하여 데이터를 운용할 수 있습니다. 여기에서는 몇 가지 일반적인 DataFrame' 작업에 대해 논의할 것입니다.
SparkContext의 생성은 Apache 프로그래밍의 첫 번째 단계입니다. 클러스터에서 작업을 실행하려면 SparkContext가 필요합니다. 클러스터에 액세스하는 방법은 SparkContext에서 알려줍니다. 또한 클러스터를 얻을 위치에 대한 Spark를 보여줍니다.
읽기: 딥 러닝 프레임워크
그런 다음 Apache 클러스터 연결이 설정됩니다. Spark Shell을 사용하는 경우 이미 생성이 완료된 것입니다. 다른 방법으로 구성 설정은 SparkContext 생성을 위해 제공, 초기화 및 가져올 수 있습니다.
생성을 위해 다음 코드를 사용할 수 있습니다.
pyspark에서 SparkContext 가져오기
sc = SparkContext()
CSV 파일에서 DataFrame 생성
CSV 파일을 읽을 수 있도록 Python의 셸에 새 라이브러리를 지정해야 합니다. 이를 위해 첫 번째 단계는 최신 버전의 Spark-CSV 패키지를 다운로드하고 Spark의 홈 디렉토리에서 패키지의 압축을 푸는 것입니다. 그런 다음 PySpark의 셸을 열고 패키지를 포함해야 합니다.
$ ./bin/pyspark – 패키지 com.databricks:spark-csv_2.10:1.3.0
이제 CSV 파일에서 데이터를 읽은 후 DataFrame이 생성됩니다.
기차 = sqlContext.load(source=”com.databricks.spark.csv”, 경로 = 'PATH/train.csv', 헤더 = True,inferSchema = True)
테스트 = sqlContext.load(소스 = "com.databricks.spark.csv", 경로 = 'PATH/test-comb.csv', 헤더 = True,inferSchema = True)
테스트 CSV 파일 및 학습 CSV 파일은 PATH라는 폴더 위치에 있습니다. 헤더가 CSV 파일에 있으면 True로 표시됩니다. 데이터 프레임의 각 열에 있는 데이터 유형을 알기 위해 inferSchema = True 옵션을 사용합니다. inferSchema = True 옵션을 사용하면 데이터 프레임의 각 열에 대한 데이터 유형의 감지가 SQL 컨텍스트에 의해 자동으로 감지됩니다. inferSchema를 true로 설정하지 않으면 모든 열이 문자열로 읽힙니다.
읽기: 기계 학습을 위한 Python 라이브러리
DataFrame 조작
이제 여기에서 데이터 프레임을 조작하는 방법을 볼 것입니다.
- 열의 데이터 유형 알기
printSchema는 열 유형과 해당 데이터 유형을 확인하는 데 사용됩니다. 이제 printSchema()를 적용하여 스키마가 트리 형식으로 인쇄됩니다.
train.printSchema()
산출:
뿌리
|– User_ID: 정수(nullable = true)
|– Product_ID: 문자열(nullable = true)
|– 성별: 문자열(nullable = true)
|– 연령: 문자열(nullable = true)
|– 직업: 정수(nullable = true)
|– City_Category: 문자열(nullable = true)
|– Stay_In_Current_City_Years: 문자열(nullable = true)
|– Marital_Status: 정수(nullable = true)
|– Product_Category_1: 정수(nullable = true)
|– Product_Category_2: 정수(nullable = true)
|– Product_Category_3: 정수(nullable = true)
|– 구매: 정수(nullable = true)
csv 파일을 읽은 후 데이터 프레임의 데이터 유형이나 각 열의 스키마를 정확하게 얻었음을 알 수 있습니다.
- 처음 n개 관찰 표시
처음 n개의 관측치를 보려면 머리 연산을 사용할 수 있습니다. Pandas의 헤드 작업은 PySpark의 헤드 작업과 동일합니다.
기차.머리(5)
산출:
[Row(User_ID=1000001, Product_ID=u'P00069042′, Gender=u'F', Age=u'0-17′, Occupation=10, City_Category=u'A', Stay_In_Current_City_Years=u'2′, Marital_Status= 0, Product_Category_1=3, Product_Category_2=없음, Product_Category_3=없음, 구매=8370),
행(User_ID=1000001, Product_ID=u'P00248942′, Gender=u'F', Age=u'0-17′, Occupation=10, City_Category=u'A', Stay_In_Current_City_Years=u'2′, Marital_Status=0 , Product_Category_1=1, Product_Category_2=6, Product_Category_3=14, 구매=15200),
행(User_ID=1000001, Product_ID=u'P00087842', Gender=u'F', Age=u'0-17', Occupation=10, City_Category=u'A', Stay_In_Current_City_Years=u'2', Marital_Status=0 , Product_Category_1=12, Product_Category_2=없음, Product_Category_3=없음, 구매=1422),
행(User_ID=1000001, Product_ID=u'P00085442′, Gender=u'F', Age=u'0-17′, Occupation=10, City_Category=u'A', Stay_In_Current_City_Years=u'2′, Marital_Status=0 , Product_Category_1=12, Product_Category_2=14, Product_Category_3=없음, 구매=1057),
Row(User_ID=1000002, Product_ID=u'P00285442', Gender=u'M', Age=u'55+', Occupation=16, City_Category=u'C', Stay_In_Current_City_Years=u'4+', Marital_Status=0 , Product_Category_1=8, Product_Category_2=없음, Product_Category_3=없음, 구매=7969)]
이제 결과가 행 형식으로 제공되기 때문에 더 나은 방식으로 결과를 보기 위해 show 작업을 사용합니다. truncate = True 인수를 사용하여 결과를 자를 수도 있습니다.
train.show(2,truncate= 참)
산출:
+——-+———-+——+—-+———-+————-+—————————+————+—————+ ——————+——————+——–+
|User_ID|제품_ID|성별| 나이|직업|City_Category|체류_현재_City_Years|결혼_상태|제품_범주_1|제품_범주_2|제품_범주_3|구매|
+——-+———-+——+—-+———-+————-+—————————+————+—————+ ——————+——————+——–+
|1000001| P00069042| F|0-17| 10| 에이| 2| 0| 3| 널| 널| 8370|
|1000001| P00248942| F|0-17| 10| 에이| 2| 0| 1| 6| 14| 15200|
+——-+———-+——+—-+———-+————-+—————————+————+—————+ ——————+——————+——–+
상위 2개 행만 표시
- DataFrame의 행 수 계산
데이터 프레임의 행 수를 계산하기 위해 count 연산을 사용할 수 있습니다. 이제 count 연산을 적용하여 테스트 파일 및 학습 파일의 행 수를 계산합니다.
train.count(),test.count()
산출:
(233598, 550069)
테스트 및 훈련에 각각 233598, 550069 행이 있습니다.
- 테스트 및 학습 파일에서 열 수 및 열 이름 가져오기
pandas의 DataFrame에서 열 작업과 유사하게 열 작업을 사용하여 열 이름을 가져옵니다. 이제 먼저 no를 인쇄합니다. 열의 이름과 테스트 파일 및 훈련 파일의 열 이름.
len(train.columns), train.columns
산출:
12 ['User_ID', '제품_ID', '성별', '나이', '직업', 'City_Category', 'Stay_In_Current_City_Years', '결혼_상태', '제품_카테고리_1', '제품_카테고리_1', '제품_카테고리_3']
이제 테스트 파일에 대해서도 유사하게 수행합니다.
len(test.columns), test.columns
산출:
13 [”, 'User_ID', '제품_ID', '성별', '나이', '직업', 'City_Category', 'Stay_In_Current_City_Years', '결혼_상태', '제품_카테고리_1', '제품_카테고리_1', '_제품_카테고리', '_제품_카테고리' ']
위의 출력 후에 훈련 파일에 12개의 열이 있고 테스트 파일에 13개의 열이 있음을 알 수 있습니다. 위의 출력에서 테스트 파일에 13개의 열이 있고 교육 파일에 12개의 열이 있음을 확인할 수 있습니다. "Comb" 열은 테스트 파일의 유일한 단일 열이며 테스트 파일에 없는 "구매"가 없습니다. 테스트 파일에 열 이름이 없는 열이 하나 더 있습니다.
- DataFrame의 숫자 열에서 개수, 최대, 최소, 표준 편차, 평균과 같은 요약 통계 가져오기
DataFrame에서 설명 작업이라는 작업을 사용합니다. 설명 연산을 사용하여 숫자 열의 계산을 수행하고 통계 요약을 얻을 수 있습니다. 모든 숫자 열은 DataFrame에서 계산되며 요약 통계 계산에 지정된 열 이름이 없습니다.
train.describe().show()
산출:
+——-+——————+—————–+——————+——————+—————+——————+—— ————+
|요약| 사용자 ID| 직업| 결혼 상태|제품_범주_1|제품_범주_2|제품_범주_3| 구매|
+——-+——————+—————–+——————+——————+—————+——————+—— ————+

| 카운트| 550068| 550068| 550068| 550068| 376430| 166821| 550068|
| 평균|1003028.8424013031|8.076706879876669|0.40965298835780306| 5.404270017525106| 9.842329251122386|12.668243206790512| 9263.968712959126|
| stddev|1727.5915855308265|6.522660487341778| 0.4917701263173273|3.9362113692014082| 5.086589648693526| 4.125337631575267|5023.0653938206015|
| 분| 1000001| 0| 0| 1| 2| 3| 12|
| 최대| 1006040| 20| 1| 20| 18| 18| 23961|
+——-+——————+—————–+——————+——————+—————+——————+—— ————+
설명 작업에서 이것은 문자열 열 이름 또는 범주 열 이름이 지정될 때 얻는 것입니다.
train.describe('제품_ID').show()
산출:
+——-+———-+
|요약|제품_ID|
+——-+———-+
| 카운트| 550068|
| 의미| 널|
| stddev| 널|
| 분| P00000142|
| 최대| P0099942|
+——-+———-+
ASCII를 기준으로 의 최대값과 최소값이 계산됩니다. 설명 작업은 문자열 유형 열에서 작업하는 데 사용됩니다.
- DataFrame의 열 선택
선택 작업에서 열 이름을 사용하여 열을 선택합니다. 쉼표를 사용하여 구분된 열의 이름을 언급합니다. 이제 훈련 파일에서 "Age"와 "User_ID"를 선택하는 방법을 살펴보겠습니다.
- train.select('User_ID','나이').show(5)
- 산출:
- +——-+—-+
- |사용자 ID| 나이|
- +——-+—-+
- |1000001|0-17|
- |1000001|0-17|
- |1000001|0-17|
- |1000001|0-17|
- |1000002| 55세 이상
- +——-+—-+
- 고유한 제품 번호 찾기 테스트 파일 및 학습 파일에서
DataFrame의 번호를 계산하려면 고유한 행의 경우 고유한 작업을 사용합니다. 이제 여기서 우리는 아니오의 계산을 위해 별개 의 연산을 적용할 것입니다. 테스트 및 교육 파일에 있는 고유한 제품의
train.select('제품_ID').distinct().count(),test.select('제품_ID').distinct().count()
산출:
(3633, 3492)
테스트 및 교육 파일에 각각 3492 및 3633개의 고유한 제품이 있습니다. 이제 우리는 출력 결과에서 배울 수 있는 것처럼 훈련 파일에 테스트 파일보다 더 많은 고유한 값이 있다는 것을 압니다. 이제 빼기 연산을 사용하여 교육 파일에는 없지만 테스트 파일에는 있는 Product_ID 범주를 찾습니다. 범주형의 모든 기능에 대해서도 동일한 작업을 수행할 수 있습니다.
diff_cat_in_train_test=test.select('제품_ID').subtract(기차.select('제품_ID'))
diff_cat_in_train_test.distinct().count()# 고유 개수
산출:
46
따라서 위의 결과에서 우리는 훈련 파일에는 없지만 테스트 파일에는 있는 47개의 다양한 범주가 있음을 알 수 있습니다. 데이터는 기차 파일에 없는 테스트 파일에서 건너뛰거나 수집됩니다.
- 범주형 열의 쌍별 빈도 계산?
할 수 있는 크로스탭 연산을 사용하여 DataFrame에서 열의 쌍별 빈도를 계산해 보겠습니다. 이제 Crosstab 연산을 적용하여 기차의 DataFrame 에서 "Gender" 및 "Age" 열을 계산해 보겠습니다 .
train.crosstab('나이', '성별').show()
산출:
+———-+—–+——+
|나이_성별| 에| 남|
+———-+—–+——+
| 0-17| 5083| 10019|
| 46-50|13199| 32502|
| 18-25|24628| 75032|
| 36-45|27170| 82843|
| 55세 이상 5083| 16421|
| 51-55| 9894| 28607|
| 26-35|50752|168835|
+———-+—–+——+
Gender의 고유 값은 열 이름이고 Age의 다른 양은 행 이름이며 위 결과에서 볼 수 있습니다. 테이블에서 쌍의 개수는 발생하지 않은 경우 0이 됩니다.
고유 행이 있는 DataFrame을 얻는 방법은 무엇입니까?
고유한 행을 찾고 중복 행을 포함하지 않으려면 dropDuplicates 작업을 사용합니다. DataFrame의 중복 행을 삭제하여 중복 행이 없는 Dataframe을 가져옵니다. 열에 대한 모든 고유 행을 가져오기 위해 dropDuplicates 절차가 수행되는 방법을 알아보려면 여기를 확인하십시오.
train.select('나이','성별').dropDuplicates().show()
산출:
+—–+——+
| 나이|성별|
+—–+——+
|51-55| 에|
|51-55| 남|
|26-35| 에|
|26-35| 남|
|36-45| 에|
|36-45| 남|
|46-50| 에|
|46-50| 남|
| 55세 이상 에|
| 55세 이상 남|
|18-25| 에|
| 0-17| 에|
|18-25| 남|
| 0-17| 남|
+—–+——+
- 행을 삭제하는 방법은 null 값입니까?
null 값이 있는 모든 행을 삭제하려면 dropna 작업이라는 작업을 사용할 수 있습니다. DataFrame에서 행을 삭제하기 위해 세 가지 옵션을 고려합니다.
- 부분 집합 - null 값이 있는 열 삭제 작업에 대해 고려해야 하는 열의 모든 이름 목록입니다.
- Thresh - null이 아닌 값을 thresh보다 작은 행을 삭제하는 데 도움이 됩니다. 기본적으로 여기에는 아무 것도 지정되어 있지 않습니다.
- 방법 – 모두 또는 임의의 두 가지 유형으로 사용할 수 있습니다. any를 사용하면 행의 값이 null인 경우 행이 삭제됩니다. all을 사용하면 모든 행의 값이 null인 경우 행이 감소합니다.
이제 여기서 우리는 이러한 모든 옵션을 하나씩 사용하여 어떻게, 없음, 모두에 대해 부분 집합, thresh, 없음과 같은 기본 옵션을 사용하여 null인 행을 삭제할 것입니다.
train.dropna().count()
산출:
166821
- 상수 번호로 DataFrame의 null 값을 채우는 방법은 무엇입니까?
null 값을 상수 번호로 채우려면 여기서는 필나 연산 을 사용 합니다. null 값을 채우기 위해 fillna 작업에서 고려해야 할 두 가지 매개변수가 있습니다 .
- 부분 집합: 여기에서 값을 채우기 위해 고려할 열을 지정해야 합니다.
- 값: 여기에서 모든 열에서 string, float, int와 같은 모든 데이터 유형이 될 수 있는 값으로 대체할 양을 언급할 수 있습니다.
여기서 우리는 기차 DataFrame에서 null 값 대신 '-1'을 채울 것입니다.
train.fillna(-1).show(2)
산출:
+——-+———-+——+—-+———-+————-+—————————+————+—————+ ——————+——————+——–+
|User_ID|제품_ID|성별| 나이|직업|City_Category|체류_현재_City_Years|결혼_상태|제품_범주_1|제품_범주_2|제품_범주_3|구매|
+——-+———-+——+—-+———-+————-+—————————+————+—————+ ——————+——————+——–+
|1000001| P00069042| F|0-17| 10| 에이| 2| 0| 3| -1| -1| 8370|
|1000001| P00248942| F|0-17| 10| 에이| 2| 0| 1| 6| 14| 15200|
+——-+———-+——+—-+———-+————-+—————————+————+—————+ ——————+——————+——–+
상위 2개 행만 표시
결론
PySpark는 인공 지능 및 기계 학습의 세계에서 추진력을 얻고 있습니다. PySpark는 실제 기계 학습 문제를 해결하는 데 사용됩니다. 외부 및 기존의 다른 데이터 소스에서 RDD를 생성하고 모든 유형의 변환을 수행할 수 있습니다. 이 기사가 정보를 제공하고 PySpark 데이터 프레임에 대한 깊은 통찰력을 제공할 수 있기를 바랍니다.
PySpark 및 기타 데이터 과학 도구에 대해 자세히 알아보려면 작업 전문가를 위해 만들어졌으며 10개 이상의 사례 연구 및 프로젝트, 실용적인 실습 워크샵, 멘토링을 제공하는 IIIT-B 및 upGrad의 데이터 과학 PG 디플로마를 확인하십시오. 업계 전문가, 업계 멘토와의 1:1 학습, 최고의 기업과의 400시간 이상의 학습 및 직업 지원.
PySpark가 Pandas보다 더 효율적입니까?
예, PySpark는 Pandas보다 빠르며 벤치마킹 테스트에서 Pandas보다 성능이 뛰어납니다. 기본적으로 Pandas는 단일 시스템에서 작업을 수행하는 반면 PySpark는 여러 시스템에서 작업을 실행합니다. 거대한 데이터 세트가 있는 기계 학습 애플리케이션에서 작업하는 경우 PySpark가 Pandas보다 100배 더 빠르게 작업을 실행할 수 있는 이상적인 옵션입니다. JVM 때문에 Scala 프로그래밍 언어는 데이터 분석 및 처리가 Python보다 10배 빠릅니다. Python 프로그래밍 코드를 사용하여 Spark 라이브러리를 호출하면 결과는 평범합니다.
Apache PySpark 사용의 단점은 무엇입니까?
Spark에는 자체 파일 관리 시스템이 없습니다. Spark를 작동하는 데 필요한 추가 메모리 비용이 높기 때문에 메모리 내 컴퓨팅은 비용이 많이 들 수 있습니다. Apache Spark를 Hadoop과 함께 사용할 때 개발자는 압축 파일에 어려움을 겪습니다. 데이터는 Spark에서 일괄적으로 반복되며 각 반복은 독립적으로 계획되고 처리됩니다. Apache Spark에서 데이터는 미리 결정된 시간 간격으로 더 작은 배치로 나뉩니다. 결과적으로 레코드 기반 창 기준은 Apache에서 지원되지 않습니다. 대신 시간 기반 창 기준을 제공합니다.
Datasets, DataFrame 및 RDD는 어떻게 다릅니까?
RDD는 여러 컴퓨터에 분산되어 있는 클러스터된 데이터 항목 모음입니다. 데이터는 Java 또는 Scala 개체의 모음인 RDD를 통해 표시됩니다. DataFrame은 여러 서버에 분산된 명명된 열로 구조화된 데이터 모음입니다. 관계형 데이터베이스에서는 개념적으로 테이블과 동일합니다. Dataset은 RDD API의 유형 안전, 객체 지향 프로그래밍 인터페이스 기능을 제공하는 데이터 프레임 API 확장입니다. DataFrame은 RDD와 유사한 분산 데이터 모음이며 변경할 수 없습니다. 데이터는 RDD가 아닌 관계형 데이터베이스의 테이블과 유사한 명명된 열로 구조화됩니다. 데이터 그룹화와 같은 간단한 작업의 경우 RDD는 데이터 프레임 및 데이터 세트보다 느립니다. 집계 작업을 수행하기 위한 간단한 API가 있습니다. RDD 및 데이터 세트보다 빠르게 데이터를 집계할 수 있습니다.