내가 스파크 1.3.1을 사용하고 내가카산드라 스파크 커넥터 및 필터링 데이터
같은 카산드라에val sc = new SparkContext(conf)
val rdd = sc.cassandraTable("foo", "bar")
val date = DateTime.now().minusHours(1)
val rdd2 = rdd.filter(r => r.getDate("date").after(date.toDate))
println(rdd2.count())
sc.stop()
이 프로그램은, 아주 긴 시간 동안 실행 메시지를 출력 데이터를 필터링 할 수있는 작은 프로그램을 작성했습니다 내가 프로그램을 종료하고
val date = DateTime.now().minusHours(1)
val rdd2 = rdd.filter(r => r.getDate("date").after(date.toDate))
에 코드를 변경하는 경우
16/09/01 21:10:31 INFO Executor: Running task 46.0 in stage 0.0 (TID 46)
16/09/01 21:10:31 INFO TaskSetManager: Finished task 42.0 in stage 0.0 (TID 42) in 20790 ms on localhost (43/1350)
는 아직 잘 모르겠지만 아주 동안 실행 프로그램은 항상 메모리에 전체 카산드라 테이블을로드하려고 (또는 완전히 스캔하려고) 만 다음 필터를 적용 할 것 같은
6/09/01 21:14:01 INFO Executor: Running task 8.0 in stage 0.0 (TID 8)
16/09/01 21:14:01 INFO TaskSetManager: Finished task 4.0 in stage 0.0 (TID 4) in 19395 ms on localhost (5/1350)
같은 메시지와 NG 시간 그래서 보인다. 그게 나에게 극도로 비효율적 인 것 같아.
스파크가 전체 cassandra 테이블을로드하거나 (완전히 스캔하여) RDD에 필터를 적용하지 않도록이 코드를 더 잘 작성하려면 어떻게해야합니까?
val rdd = sc.cassandraTable("foo", "bar")
val date = DateTime.now().minusDays(30)
rdd.filter(r => r.getDate("date").after(date.toDate)).count // Count Filtered RDD
코드
의
날짜 열이 클러스터링 키인지 어떻게 확인할 수 있습니까? 제가 발행 할 수있는 명령이 있습니까? –
나는 당신의 제안을 시도했지만 필터의 결과를 rdd2에 할당하고 그 결과를 계산했다. 로컬 호스트 (11/1350)에서 112031ms에 '0.0 단계 (TID 4)의 완결 된 태스크 4.0'을 말하고 있습니다. –
클러스터링 키는 카산드라의 디스크에 정보를 정리하는 개념입니다. Cassandra 스키마의 핵심 요소입니다. 코드를 게시하지 않았기 때문에 어떤 시간이 걸리는지 대답 할 수 없습니다. 많은 작업을 통해 실행되는 것을 볼 수 있습니다. 그러나 푸시 다운이없는 전체 테이블 스캔보다 느린 경우는 거의 없습니다. – RussS