2016-07-25 21 views
6

Spark içinde Scala kullanıyorum ve birleştirilmiş sütunlarım anonim. Veri kümesinden birden çok sütun yeniden adlandırmak için uygun bir yol var mı? Ben as ile bir şema empoze düşündüm ama anahtar sütun bir yapıdır (groupBy işlemi nedeniyle), ve bir case class bir StructType ile tanımlamak nasıl bulamıyorum. Toplama sütunları nasıl adlandırılır?

ben şöyle bir şema tanımlama çalıştı:

val returnSchema = StructType(StructField("edge", StructType(StructField("src", IntegerType, true), 
                  StructField("dst", IntegerType), true)), 
           StructField("count", LongType, true)) 
edge_count.as[returnSchema] 

ama bir derleme hatası var:

Message: <console>:74: error: overloaded method value apply with alternatives: 
    (fields: Array[org.apache.spark.sql.types.StructField])org.apache.spark.sql.types.StructType <and> 
    (fields: java.util.List[org.apache.spark.sql.types.StructField])org.apache.spark.sql.types.StructType <and> 
    (fields: Seq[org.apache.spark.sql.types.StructField])org.apache.spark.sql.types.StructType 
cannot be applied to (org.apache.spark.sql.types.StructField, org.apache.spark.sql.types.StructField, Boolean) 
     val returnSchema = StructType(StructField("edge", StructType(StructField("src", IntegerType, true), 
+0

bize kod gösterebilir misiniz: örneğin

ds.select($"key.src".as[Short], $"key.dst".as[Short], $"sum(count)".alias("count").as[Long]) 

Önce türetilmiş sütun adlarını belirlemek için printSchema kullanmak zorunda? Yani belki daha iyi bir yaklaşım formüle edebilirim? –

+0

Üç sütun içeren bir veri kümeniz var. İlk ikisine göre gruplayın ve üçüncüyle sayın. Anahtar o zaman bir tuple. Spark 1.6.2'deyim. Teşekkürler @AlbertoBonsanto! – Emre

cevap

0

select deyimiyle alias es kullanarak bitti;

> ds.printSchema 

root 
|-- key: struct (nullable = false) 
| |-- src: short (nullable = false) 
| |-- dst: short (nullable = false) 
|-- sum(count): long (nullable = true) 
6

iyi çözüm örn açıkça Sütunlarınızın isim olduğunu

df 
    .groupBy('a, 'b) 
    .agg(
    expr("count(*) as cnt"), 
    expr("sum(x) as x"), 
    expr("sum(y)").as("y") 
) 

Veri kümesi kullanıyorsanız, sütunlarınızın türünü belirtmeniz gerekir, örneğin, expr("count(*) as cnt").as[Long].

DSL'yi doğrudan kullanabilirsiniz, ancak genellikle bunu basit SQL ifadelerinden daha ayrıntılı olarak bulurum.

Toplu yeniden adlandırma yapmak isterseniz, Map ve ardından foldLeft veri aralığını kullanın.

+0

Bu bana bir tür uyuşmazlığı hatası veriyor; giriş bir veri kümesidir. – Emre

+0

Çünkü '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''} Bir veri kümesi örneği göstermek için cevabı güncelledim. – Sim