2016-05-30 22 views
1

ich einen Datenrahmen mit „Woche“ haben & „Jahr“ Spalte und muss Monat berechnen für gleiche wie unten:SPARK SQL: Get Monat Woche und Jahr

Eingang:

+----+----+ |Week|Year| +----+----+ | 50|2012| | 50|2012| | 50|2012|

Erwartete Ausgabe:

+----+----+-----+ |Week|Year|Month| +----+----+-----+ | 50|2012|12 | | 50|2012|12 | | 50|2012|12 |

Jede Hilfe würde geschätzt. Dank

+1

Was Wochen zu tun, die sich über zwei Monate betragen? Ist die Woche keine schwache Variable, um den Monat abzuleiten? –

Antwort

1

Dank @ zero323, der mich auf die Abfrage sqlContext.sql wies darauf hin, umgerechnet ich die Abfrage in der folgenden:

import org.apache.spark.SparkConf; 
import org.apache.spark.api.java.JavaRDD; 
import org.apache.spark.api.java.JavaSparkContext; 
import org.apache.spark.sql.DataFrame; 
import org.apache.spark.sql.RowFactory; 
import org.apache.spark.sql.SQLContext; 
import org.apache.spark.sql.types.DataTypes; 
import org.apache.spark.sql.types.StructField; 
import org.apache.spark.sql.types.StructType; 

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 

import static org.apache.spark.sql.functions.*; 

public class MonthFromWeekSparkSQL { 

    public static void main(String[] args) { 

     SparkConf conf = new SparkConf().setAppName("MonthFromWeekSparkSQL").setMaster("local"); 
     JavaSparkContext sc = new JavaSparkContext(conf); 
     SQLContext sqlContext = new org.apache.spark.sql.SQLContext(sc); 

     List myList = Arrays.asList(RowFactory.create(50, 2012), RowFactory.create(50, 2012), RowFactory.create(50, 2012)); 
     JavaRDD myRDD = sc.parallelize(myList); 

     List<StructField> structFields = new ArrayList<StructField>(); 

     // Create StructFields 
     StructField structField1 = DataTypes.createStructField("week", DataTypes.IntegerType, true); 
     StructField structField2 = DataTypes.createStructField("year", DataTypes.IntegerType, true); 

     // Add StructFields into list 
     structFields.add(structField1); 
     structFields.add(structField2); 

     // Create StructType from StructFields. This will be used to create DataFrame 
     StructType schema = DataTypes.createStructType(structFields); 

     DataFrame df = sqlContext.createDataFrame(myRDD, schema); 
     DataFrame df2 = df.withColumn("yearAndWeek", concat(col("year"), lit(" "), col("week"))) 
       .withColumn("month", month(unix_timestamp(col("yearAndWeek"), "yyyy w").cast(("timestamp")))).drop("yearAndWeek"); 

     df2.show(); 

    } 

} 

Sie erstellen tatsächlich eine neue Spalte mit Jahr und Woche formatiert als „yyyy w "wandeln Sie es dann mit unix_timestamp um, von dem Sie den Monat ziehen können, wie Sie sehen.

PS: Es scheint, dass Guss Verhalten in Funken 1.5 falsch war -

Also in diesem Fall, es allgemeinere ist .cast("double").cast("timestamp")

+0

In meinem Fall wird nur die Zeit erhöht, ohne Monat und Jahr zu ändern. Bitte schauen Sie sich die folgende Seite an: https://gist.github.com/nareshbab/7d945ccaaae07ca743dec0ea07bb50c0 – nareshbabral

+0

Sie haben den Code nicht richtig kopiert, also überprüfen Sie bitte Ihren Code! – eliasah

+1

Danke, jetzt funktioniert es – nareshbabral

Verwandte Themen