4

私はSCALAを使用してSPARK 1.6.1バージョンで作業していて、異常な問題に直面しています。同じ実行中に作成された既存の列を使用して新しい列を作成する場合は、「org.apache.spark.sql.AnalysisException」を取得します。
WORKING:Sparkを使用してデータフレームのカラムにアクセス

val resultDataFrame = dataFrame.withColumn("FirstColumn",lit(2021)).withColumn("SecondColumn",when($"FirstColumn" - 2021 === 0, 1).otherwise(10)) 
    resultDataFrame.printSchema(). 

私は同じ実行中に作成FirstColumnを使用して、私のSecondColumnを作成しています。ここ

val resultDataFrame = dataFrame.withColumn("FirstColumn",lit(2021)).withColumn("SecondColumn",when($"FirstColumn" - **max($"FirstColumn")** === 0, 1).otherwise(10)) 
resultDataFrame.printSchema(). 

を働いていません。質問は、avg/max関数を使用しているときに動作しない理由です。この問題を解決する方法を教えてください。

+1

最大(平均/合計、など)グループ化されたDataFrame(つまりgroupByの後)または '.over(window)'句で使用する必要があります。 –

答えて

2

「通常」の列と一緒に集計関数を使用する場合は、関数はgroupByまたはWindow定義節の後に来る必要があります。これらのケースの中で彼らは意味をなさない。例:

val result = df.groupBy($"col1").max("col2").as("max") // This works 

上記の場合、結果のDataFrameは「col1」と「max」の両方の列を持ちます。

val max = df.select(min("col2"), max("col2")) 

これは、クエリに集計関数しかないために機能します。ただし、以下は動作しません。

val result = df.filter($"col1" === max($"col2")) 

私は集計の列と非集計列をミックスしようとしていますので。あなたが集計値を持つ列を比較したい場合は、あなたが試すことができ

参加:

val maxDf = df.select(max("col2").as("maxValue")) 
val joined = df.join(maxDf) 
val result = joined.filter($"col1" === $"maxValue").drop("maxValue") 

を、あるいは単純な値を使用します。

val maxValue = df.select(max("col2")).first.get(0) 
val result = filter($"col1" === maxValue) 
関連する問題