RDD의 내용을 인쇄하는 방법은 무엇입니까?


124

컬렉션의 내용을 Spark 콘솔에 인쇄하려고합니다.

나는 유형이 있습니다 :

linesWithSessionId: org.apache.spark.rdd.RDD[String] = FilteredRDD[3]

그리고 다음 명령을 사용합니다.

scala> linesWithSessionId.map(line => println(line))

그러나 이것은 인쇄됩니다.

res1 : org.apache.spark.rdd.RDD [Unit] = MappedRDD [4] at map at : 19

RDD를 콘솔에 쓰거나 내용을 볼 수 있도록 디스크에 저장하려면 어떻게해야합니까?


1
안녕하세요! 답변에 대한 의견을 읽었습니까? 그것은 오해의 소지가있는 것으로 보인다
dk14

2
@ dk14 동의, 수락 된 답변을 다시 할당했습니다
blue-sky

RDD는 2 급 시민으로 강등되고 있으므로 DataFrame과 show메서드 를 사용해야합니다 .
Thomas Decaux 2017 년

답변:


235

RDD의 내용을 보려면 다음을 사용하는 방법이 있습니다 collect().

myRDD.collect().foreach(println)

그러나 RDD에 수십억 개의 라인이있는 경우 이는 좋은 생각이 아닙니다. 사용하여 take()인쇄 할 몇 가지를 취할 :

myRDD.take(n).foreach(println)

1
RDD (수백만 줄)에서 foreach를 사용하여 콘텐츠를 단일 파일로 HDFS에 쓰는 경우 클러스터에서 문제없이 작동합니까?
Shankar

내가 사용하고 있지 않다 이유는 saveAsTextFile내가 사용하는 이유 RDD에 내가 하나 개 이상의 파일로 RDD 내용을 작성해야한다, 그건foreach

단일 파일에 저장하려는 경우 saveAsTextFile을 호출하기 전에 RDD를 하나의 파티션으로 통합 할 수 있지만이 경우에도 문제가 발생할 수 있습니다. 나는 최고의 옵션은 사용 후, HDFS에서 여러 파일에 작성하는 것입니다 생각 HDFS DFS --getmerge 파일 병합하기 위해
사마

RDD에서 foreach를 사용할 때 드라이버의 RAM에 유지 될 것이라고 말했습니다. 진술이 맞습니까? 내가 이해 한 것은 foreach가 드라이버가 아닌 각 작업자 [클러스터]에서 실행된다는 것입니다.
Shankar

saveAsTextFile은 파티션 당 하나의 파일을 작성하는데, 이는 여러분이 원하는 것입니다 (여러 파일). 그렇지 않으면 Oussama가 제안한대로 rdd.coalesce (1) .saveAsTextFile ()을 수행하여 하나의 파일을 얻을 수 있습니다. RDD에 원하는 파티션이 너무 적 으면 rdd.repartition (N) .saveAsTextFile ()
foghorn

49

map함수는 변환 입니다. 즉, Spark에서 작업 을 실행할 때까지 실제로 RDD를 평가하지 않습니다 .

인쇄하려면 다음을 사용할 수 있습니다 foreach(액션 임).

linesWithSessionId.foreach(println)

디스크에 쓰려면 RDD APIsaveAs...함수 (정지 작업) 중 하나를 사용할 수 있습니다.


6
collectRDD가 콘솔에서 인쇄 될 수 있도록 언급해야 할 수도 있습니다.
zsxwing 2014

1
foreach자체적으로 먼저 RDD를 "구체화"한 다음 println각 요소에서 실행 되므로 collect여기에서는 실제로 필요하지 않습니다 (물론 사용할 수 있음) ...
fedragon

5
실제로 collect () 없이는 foreach 전에 콘솔에서 아무것도 볼 수 없습니다.
Vittorio Cozzolino

3
실제로 1.2.0에서도 내 Spark 셸에서 완전히 잘 작동합니다. 그러나 나는이 혼란의 원인을 알고 있다고 생각합니다. 원래 질문은 RDD를 Spark 콘솔 (= 셸)에 인쇄하는 방법을 물었으므로 로컬 작업을 실행한다고 가정했습니다 foreach. 클러스터에서 작업을 실행 중이고 rdd를 인쇄하려면 실행 collect되기 전에 드라이버로 전송되도록 다른 주석과 답변에서 지적한대로 해야합니다 println. takeRDD가 너무 큰 경우 Oussama가 제안한대로 사용 하는 것이 좋습니다.
fedragon 2015 년

6
위의 대답은 나쁘다. 당신은 그것을 받아들이지 말아야합니다. Foreach는 콘솔에 인쇄하지 않고 작업자 노드에 인쇄합니다. 노드가 하나만 있으면 foreach가 작동합니다. 그러나 노드가 하나만 있다면 왜 스파크를 사용합니까? SQL awk, Grep 또는 훨씬 더 간단한 것을 사용하십시오. 그래서 유일하게 유효한 대답은 수집이라고 생각합니다. 수집이 큰 경우 아래에 설명 된대로 테이크 또는 헤드 또는 유사한 기능을 사용하는 샘플 만 원합니다.
eshalev

12

클러스터에서 이것을 실행하는 경우 println컨텍스트로 다시 인쇄되지 않습니다. RDD세션에 데이터 를 가져와야합니다 . 이렇게하려면 로컬 배열에 강제로 적용한 다음 인쇄 할 수 있습니다.

linesWithSessionId.toArray().foreach(line => println(line))

12

당신은 당신을 변환 할 수 있습니다 RDDA를 DataFrame다음 show()그것.

// For implicit conversion from RDD to DataFrame
import spark.implicits._

fruits = sc.parallelize([("apple", 1), ("banana", 2), ("orange", 17)])

// convert to DF then show it
fruits.toDF().show()

이렇게하면 데이터의 상위 20 줄이 표시되므로 데이터 크기는 문제가되지 않습니다.

+------+---+                                                                    
|    _1| _2|
+------+---+
| apple|  1|
|banana|  2|
|orange| 17|
+------+---+

1
나는 그것이 생각import spark.implicits._
라이언 하트

여기서 사용 된 도서관은 무엇입니까? 나는 스파크 스코프 toDF에서도 감지 할 수 없습니다 spark.implicits._.
Sergii

1

myRDD.foreach(println)와 사이에는 아마도 많은 구조적 차이가있을 것입니다 myRDD.collect().foreach(println)( '수집'뿐만 아니라 다른 작업도 포함). 내가 본 차이점 중 하나는를 할 때 myRDD.foreach(println)출력이 임의의 순서로 표시된다는 것입니다. 예를 들어 : 내 rdd가 각 줄에 숫자가있는 텍스트 파일에서 오는 경우 출력 순서가 다릅니다. 그러나 내가했을 때 myRDD.collect().foreach(println)순서는 텍스트 파일과 동일하게 유지됩니다.


1

파이썬에서

   linesWithSessionIdCollect = linesWithSessionId.collect()
   linesWithSessionIdCollect

그러면 RDD의 모든 내용이 출력됩니다.


1
감사합니다.하지만 저는 파이썬이 아닌 스칼라로이 질문에 태그를 붙
blue-sky

1
c.take(10)

Spark 최신 버전은 테이블을 멋지게 표시합니다.


1

매번 입력하는 대신 다음을 수행 할 수 있습니다.

[1] Spark Shell에서 일반적인 인쇄 방법을 만듭니다.

def p(rdd: org.apache.spark.rdd.RDD[_]) = rdd.foreach(println)

[2] 또는 더 나은 방법은 암시 적을 사용하여 RDD 클래스에 함수를 추가하여 내용을 인쇄 할 수 있다는 것입니다.

implicit class Printer(rdd: org.apache.spark.rdd.RDD[_]) {
    def print = rdd.foreach(println)
}

사용 예 :

val rdd = sc.parallelize(List(1,2,3,4)).map(_*2)

p(rdd) // 1
rdd.print // 2

산출:

2
6
4
8

중대한

이것은 로컬 모드에서 소량의 데이터 세트로 작업하는 경우에만 의미가 있습니다. 그렇지 않으면 큰 데이터 세트 결과로 인해 클라이언트에서 결과를 볼 수 없거나 메모리가 부족합니다.



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.