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

컬렉션의 내용을 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를 콘솔에 쓰거나 내용을 볼 수 있도록 디스크에 저장하려면 어떻게해야합니까?



답변

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

myRDD.collect().foreach(println)

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

myRDD.take(n).foreach(println)


답변

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

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

linesWithSessionId.foreach(println)

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


답변

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

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


답변

당신은 당신을 변환 할 수 있습니다 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|
+------+---+


답변

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


답변

파이썬에서

   linesWithSessionIdCollect = linesWithSessionId.collect()
   linesWithSessionIdCollect

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


답변

c.take(10)

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