1
exitTotalDF 
    .filter($"accid" === "dc215673-ef22-4d59-0998-455b82000015") 
    .groupBy("exiturl") 
    .agg(first("accid"), first("segment"), $"exiturl", sum("session"), sum("sessionfirst"), first("date")) 
    .orderBy(desc("session")) 
    .take(500) 

org.apache.spark.sql.AnalysisException: cannot resolve '`session`' given input columns: [first(accid, false), first(date, false), sum(session), exiturl, sum(sessionfirst), first(segment, false)] 

そのようなsum関数は列名を正しく見つけることができません。通常、このようなシナリオでは、私は列にasメソッドを使用しますorg.apache.spark.sql.AnalysisException:指定された入力列を解決できません

答えて

3

スパーク2.1を使用して

。たとえば、.agg(first("accid"), first("segment"), $"exiturl", sum("session").as("session"), sum("sessionfirst"), first("date"))です。これにより、期待する内容をより詳細に制御できます。また、sparkの将来のバージョンで集計名が変更された場合、データセット内のすべての名前を更新する頭痛が減ります。

また、簡単なテストを実行しました。名前を指定しないと、Spark 2.1の名前が "sum(session)"に変更されたように見えます。これを見つける方法の1つは、データセットのprintSchemaを呼び出すことです。私はのでwithColumnRenamed()代わりのas()を使用して好む

+0

ありがとうございました! – ozzieisaacs

1

as() 1で

は、彼がこのように必要なすべての列リストしています

df.select(first("accid"), 
      first("segment"), 
      $"exiturl", 
      col('sum("session")').as("session"), 
      sum("sessionfirst"), 
      first("date")) 

VS withColumnRenamedを1つのライナーです:

df1 = df.withColumnRenamed('sum("session")', "session") 

出力df1には、dfが持つすべての列がその合計( "session")列の名前が "session"に変更されました

関連する問題