2016-01-11 97 views
1

下面的代碼不起作用:鏈接數據幀函數調用

val newDF = df 
      .withColumn("timestamp", when(df("processingDate").isNull, lit(new Timestamp(System.currentTimeMillis))).otherwise(df("processingDate"))) 
      .withColumn("year", year(df("timestamp"))) 
      .withColumn("month", month(df("timestamp"))) 
      .withColumn("day", dayofmonth(df("timestamp"))) 

如果我運行它,我會得到以下異常:

Exception in thread "main" org.apache.spark.sql.AnalysisException: Cannot resolve column name "timestamp" among ... 

的問題是,雖然我已經加入「時間戳」作爲一個專欄,它不是原始的,不可變的「df」的一部分。

有沒有辦法引用調用鏈中的前一個Dataframe?

我會將我的代碼更新到以下版本,以便它能正常工作,但我想知道是否有更好的方法。

val dfWithTimestamp = df.withColumn("timestamp", when(df("monBusinessDateTimestamp").isNull, lit(new Timestamp(System.currentTimeMillis))).otherwise(df("monBusinessDateTimestamp"))) 

val newDF = dfWithTimestamp 
      .withColumn("year", year(dfWithTimestamp("timestamp"))) 
      .withColumn("month", month(dfWithTimestamp("timestamp"))) 
      .withColumn("day", dayofmonth(dfWithTimestamp("timestamp"))) 
+0

您可以共享Dataframe的模式嗎? – eliasah

回答

2

我現在不能檢查,但

val newDF = df 
      .withColumn("timestamp", when(df("processingDate").isNull, lit(new Timestamp(System.currentTimeMillis))).otherwise(df("processingDate"))) 
      .withColumn("year", year($"timestamp")) 
      .withColumn("month", month($"timestamp")) 
      .withColumn("day", dayofmonth($"timestamp")) 

可能會奏效。

+0

非常接近,更新了一個小的更正。謝謝你的幫助。 –