2016-04-14 23 views
1

Veri çerçevemi seçili sütunları kullanarak stringtype öğesinden priderred türüne ve prerred order'a dökerek sıralamak istiyorum. Ancak bir sütunun basit bir dökümü bile bu istisnayı ve işe yaramaz. Örnek kod burada sağladım.Scala + Spark + Dataframe Exception Bir sütunu dinamik olarak yayınlamaya ve sıralama sırasını atamaya çalıştığımda

val conf = new SparkConf().setAppName("Sparkify").setMaster("local[*]") 
    val sparkContext =new SparkContext(conf) 
    val sqlContext = new SQLContext(sparkContext) 
    var df = sqlContext.read 
     .format("com.databricks.spark.csv") 
     .option("header", "true") 
     .load("example-data.csv") 
// val colsToSort= List("age") 
    df = df.sort(df.col("age").cast(IntegerType).desc) 
    df.show() 
    sparkContext.stop() 

basit csv bu

+-----+---+---+ 
| name|sex|age| 
+-----+---+---+ 
|Alice| f| 34| 
| Bob| m| 63| 
|Alice| f| 14| 
| Bob| m| 6| 
+-----+---+---+ 

ayrıntılı durum yığın gibi görünüyor.

Exception in thread "main" org.apache.spark.sql.catalyst.analysis.UnresolvedException: Invalid call to dataType on unresolved object, tree: unresolvedalias(cast(cast(age#2 as decimal(20,0)) as int)) 
    at org.apache.spark.sql.catalyst.analysis.UnresolvedAlias.dataType(unresolved.scala:295) 
    at org.apache.spark.sql.catalyst.expressions.SortOrder.dataType(SortOrder.scala:49) 
    at org.apache.spark.sql.catalyst.expressions.SortOrder.checkInputDataTypes(SortOrder.scala:42) 
    at org.apache.spark.sql.catalyst.analysis.CheckAnalysis$$anonfun$checkAnalysis$1$$anonfun$apply$2.applyOrElse(CheckAnalysis.scala:62) 
    at org.apache.spark.sql.catalyst.analysis.CheckAnalysis$$anonfun$checkAnalysis$1$$anonfun$apply$2.applyOrElse(CheckAnalysis.scala:57) 
    at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$transformUp$1.apply(TreeNode.scala:319) 
    at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$transformUp$1.apply(TreeNode.scala:319) 
    at org.apache.spark.sql.catalyst.trees.CurrentOrigin$.withOrigin(TreeNode.scala:53) 
    at org.apache.spark.sql.catalyst.trees.TreeNode.transformUp(TreeNode.scala:318) 
    at org.apache.spark.sql.catalyst.plans.QueryPlan.transformExpressionUp$1(QueryPlan.scala:107) 
    at org.apache.spark.sql.catalyst.plans.QueryPlan.org$apache$spark$sql$catalyst$plans$QueryPlan$$recursiveTransform$2(QueryPlan.scala:117) 
    at org.apache.spark.sql.catalyst.plans.QueryPlan$$anonfun$org$apache$spark$sql$catalyst$plans$QueryPlan$$recursiveTransform$2$1.apply(QueryPlan.scala:121) 

Neyi yanlış yapıyorum? Ya da tip dökümü ve siparişi ile birden çok sütuna dayalı bir sıralama ifadesini dinamik olarak bildirmenin en iyi yolu nedir?

Bu konuda bana yardımcı olabilecek herhangi biri var mı?

cevap

0

sort işlevindeki yeni sütunu yaratamazsınız - bunu sort'dan önce yapmanız gerekir. artık şöyle bir şey deneyin: Eğer kolon adı için bir değişken kullanmak istiyorsanız

df.withColumn("age", $"age".cast(IntegerType)).sort($"age".desc) 

, şunu deneyin:

val colName = "age" 
df.withColumn(colName, col(colName).cast(IntegerType)).sort(col(colName).desc) 

Not

, bu aynı adlı sütun ile iki tablo birleştirme sürece Genellikle col(...)'un önünde df.'u bırakabilirsiniz. Eğer df oluşturmadan önce Hatta sort sütun oluşturabilir ve iyi çalışıyor:

val sortCol = col("age").desc 
val df = ... 
df.sort(sortCol) 

Bu şekilde tek bir sütunda daha atmak istiyorsanız kolayca birden DataFrames

aynı sort uygulayabilirsiniz , sadece yapabileceği: withColumn her bir döküm ifadesidir

df.withColumn(...).withColumn(...).withColumn(...) 

. Yoksa yapabilirdi:

df.select($"age".cast(IntegerType), $"otherCol".cast(DoubleType), ...) 
+0

i ilk yaklaşım kullanıyorum eğer diyelim, ben sütun adı yerine dize tutan bir değişken dize için bunu yine de var mı? Örtük değişken ile çalışmadığı gibi, "var colName =" age " df.withColumn (colName, df.col (colName) .cast (IntegerType)). Sort (df.col (colName) .desc) '. lütfen bana bunda yardım eder misin? – NehaM

+0

Bu benim için mükemmel çalışıyor: 'val colName =" age "; df.withColumn (colName, df.col (colName) .cast (IntegerType)) ' –

+0

Bekleyin,' sort' ile hata oluştu. Bunu deneyin: val valName = "age"; df.withColumn (colName, df.col (colName) .cast (IntegerType)). sort (col (colName) .desc) '- Not' df.col (colName) ',' col (colName) '. –