2016-11-23 21 views
6

Kıvılcım 1.6.1 kullanıyorum ve böyle bir veri çerçevem ​​var."küp" sadece kıvılcım veri çerçevesindeki belirli alanlar için nasıl kullanılır?

+-------------+-----------+-----------------+-------+-------+-------+----------+-------+-------+-------+-------+ 
|  scene_id| action_id|  classifier|os_name|country|app_ver| p0value|p1value|p2value|p3value|p4value| 
+-------------+-----------+-----------------+-------+-------+-------+----------+-------+-------+-------+-------+ 
| test_home|scene_enter|  test_home|android|  KR| 5.6.3|__OTHERS__| false| test| test| test| 
...... 

Ayrıca, aşağıdaki gibi veri işlemlerini küp işlemi kullanarak almak istiyorum.

aşağıda gibi çalıştık

+-------------+-----------+-----------------+-------+-------+-------+----------+-------+-------+-------+-------+---+ 
|  scene_id| action_id|  classifier|os_name|country|app_ver| p0value|p1value|p2value|p3value|p4value|cnt| 
+-------------+-----------+-----------------+-------+-------+-------+----------+-------+-------+-------+-------+---+ 
| test_home|scene_enter|  test_home|android|  KR| 5.6.3|__OTHERS__| false| test| test| test| 9| 
| test_home|scene_enter|  test_home| null|  KR| 5.6.3|__OTHERS__| false| test| test| test| 35| 
| test_home|scene_enter|  test_home|android| null| 5.6.3|__OTHERS__| false| test| test| test| 98| 
| test_home|scene_enter|  test_home|android|  KR| null|__OTHERS__| false| test| test| test|101| 
| test_home|scene_enter|  test_home| null| null| 5.6.3|__OTHERS__| false| test| test| test|301| 
| test_home|scene_enter|  test_home| null|  KR| null|__OTHERS__| false| test| test| test|225| 
| test_home|scene_enter|  test_home|android| null| null|__OTHERS__| false| test| test| test|312| 
| test_home|scene_enter|  test_home| null| null| null|__OTHERS__| false| test| test| test|521| 
...... 

(her alanda göre gruplanmış, ancak yalnızca "OS_NAME", "ülke", "app_ver" alanları kuşbaşı vardır), ama yavaş ve çirkin gibi görünüyor ..

var cubed = df 
    .cube($"scene_id", $"action_id", $"classifier", $"country", $"os_name", $"app_ver", $"p0value", $"p1value", $"p2value", $"p3value", $"p4value") 
    .count 
    .where("scene_id IS NOT NULL AND action_id IS NOT NULL AND classifier IS NOT NULL AND p0value IS NOT NULL AND p1value IS NOT NULL AND p2value IS NOT NULL AND p3value IS NOT NULL AND p4value IS NOT NULL") 

Daha iyi çözümler? Lütfen kötü ingilizcemi kullan .. ^^; peşin

Teşekkür ..

+0

Teşekkür ama 'NULL' değerleri' cube' operasyon @CarlosVilchez tarafından üretildi ... –

cevap

4

Sana sorunu tamamen kaçınamaz ama onun ölçeğini azaltabilir basit hile var olduğuna inanıyoruz. Fikir, marjinalleştirilmemesi gereken tüm sütunları tek bir yer tutucuyla değiştirmektir. Örneğin

varsa bir DataFrame:

val df = Seq((1, 2, 3, 4, 5, 6)).toDF("a", "b", "c", "d", "e", "f") 

ve sizin için yerine tanımlayabilirsiniz a..c tarafından küpün d ve e tarafından dışlanmış ve gruplandırılmış ilgilendiğiniz a..c olarak:

import org.apache.spark.sql.functions.struct 
import sparkSql.implicits._ 

// alias here may not work in Spark 1.6 
val rest = struct(Seq($"a", $"b", $"c"): _*).alias("rest") 

ve cube:

val cubed = Seq($"d", $"e") 

// If there is a problem with aliasing rest it can done here. 
val tmp = df.cube(rest.alias("rest") +: cubed: _*).count 

Hızlı filtre ve geri kalanı işlemesi gerektiğini belirleyin: gibi sonuçla

tmp.where($"rest".isNotNull).select($"rest.*" +: cubed :+ $"count": _*) 

:

+---+---+---+----+----+-----+ 
| a| b| c| d| e|count| 
+---+---+---+----+----+-----+ 
| 1| 2| 3|null| 5| 1| 
| 1| 2| 3|null|null| 1| 
| 1| 2| 3| 4| 5| 1| 
| 1| 2| 3| 4|null| 1| 
+---+---+---+----+----+-----+ 
İlgili konular