2015-05-13 21 views
17

Tôi đang cố gắng so sánh các cách khác nhau để tổng hợp dữ liệu của mình.Spark: Cách dịch số (riêng biệt (giá trị)) trong API của Dataframe

Đây là dữ liệu đầu vào của tôi với 2 yếu tố (trang, khách truy cập):

(PAG1,V1) 
(PAG1,V1) 
(PAG2,V1) 
(PAG2,V2) 
(PAG2,V1) 
(PAG1,V1) 
(PAG1,V2) 
(PAG1,V1) 
(PAG1,V2) 
(PAG1,V1) 
(PAG2,V2) 
(PAG1,V3) 

Làm việc với một lệnh SQL vào Spark SQL với mã này:

import sqlContext.implicits._ 
case class Log(page: String, visitor: String) 
val logs = data.map(p => Log(p._1,p._2)).toDF() 
logs.registerTempTable("logs") 
val sqlResult= sqlContext.sql(
           """select page 
             ,count(distinct visitor) as visitor 
            from logs 
           group by page 
           """) 
val result = sqlResult.map(x=>(x(0).toString,x(1).toString)) 
result.foreach(println) 

tôi nhận được kết quả này:

(PAG1,3) // PAG1 has been visited by 3 different visitors 
(PAG2,2) // PAG2 has been visited by 2 different visitors 

Bây giờ, tôi muốn nhận được kết quả tương tự bằng cách sử dụng Dataframes và API cấp, nhưng tôi không thể nhận được cùng một đầu ra:

import sqlContext.implicits._ 
case class Log(page: String, visitor: String) 
val logs = data.map(p => Coppia(p._1,p._2)).toDF() 
val result = log.select("page","visitor").groupBy("page").count().distinct 
result.foreach(println) 

Trong thực tế, đó là những gì tôi nhận được là đầu ra:

[PAG1,8] // just the simple page count for every page 
[PAG2,4] 

Đây có thể là một cái gì đó ngu ngốc, nhưng tôi không thể nhìn thấy nó ngay bây giờ.

Cảm ơn trước!

FF

Trả lời

36

các DataFrame tập hợp chức năng countDistinct gì bạn cần là:

import sqlContext.implicits._ 
import org.apache.spark.sql.functions._ 

case class Log(page: String, visitor: String) 

val logs = data.map(p => Coppia(p._1,p._2)) 
      .toDF() 

val result = log.select("page","visitor") 
      .groupBy('page) 
      .agg('page, countDistinct('visitor)) 

result.foreach(println) 
+2

tôi nhận được lỗi này -> không tìm thấy: giá trị countDistinct –

+1

đó là một phương pháp trong 'org.apache.spark.sql .functions', nhập nội dung đó :), chỉnh sửa xong. –

+0

với intelliJ Tôi muốn viết lệnh agg/countDistinct như thế này .agg (org.apache.spark.sql.functions.countDistinct ("khách truy cập")) bởi vì ngay cả khi tôi đã nhập org.apache.spark.sql. chức năng nó vẫn mang lại cho tôi lỗi tương tự ... dù sao nó cũng hiệu quả, nhưng tôi chỉ nhận được cột khách truy cập và không có cột trang ([2], [3]) ... tôi đang thiếu gì? –

Các vấn đề liên quan