Apache spark Spark SQL:从周数和年数中获取月份

Apache spark Spark SQL:从周数和年数中获取月份,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我有一个带有“周”和“年”列的数据框,需要计算月份,如下所示: 输入: +----+----+ |Week|Year| +----+----+ | 50|2012| | 50|2012| | 50|2012| 预期产出: +----+----+-----+ |Week|Year|Month| +----+----+-----+ | 50|2012|12 | | 50|2012|12 | | 50|2012|12 | 任何帮助都将不胜感激。感谢@zero323,他向我指

我有一个带有“周”和“年”列的数据框,需要计算月份,如下所示:

输入:

+----+----+
|Week|Year|
+----+----+
|  50|2012|
|  50|2012|
|  50|2012|
预期产出:

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

任何帮助都将不胜感激。感谢@zero323,他向我指出了sqlContext.sql查询,我在下面转换了查询:

import org.apache.spark.SparkConf;
导入org.apache.spark.api.java.JavaRDD;
导入org.apache.spark.api.java.JavaSparkContext;
导入org.apache.spark.sql.DataFrame;
导入org.apache.spark.sql.RowFactory;
导入org.apache.spark.sql.SQLContext;
导入org.apache.spark.sql.types.DataTypes;
导入org.apache.spark.sql.types.StructField;
导入org.apache.spark.sql.types.StructType;
导入java.util.ArrayList;
导入java.util.array;
导入java.util.List;
导入静态org.apache.spark.sql.functions.*;
公共类MonthFromWeekSparkSQL{
公共静态void main(字符串[]args){
SparkConf conf=new SparkConf().setAppName(“MonthFromWeekSparkSQL”).setMaster(“本地”);
JavaSparkContext sc=新的JavaSparkContext(conf);
SQLContext SQLContext=neworg.apache.spark.sql.SQLContext(sc);
List myList=Arrays.asList(RowFactory.create(502012)、RowFactory.create(502012)、RowFactory.create(502012));
JavaRDD myRDD=sc.parallelize(myList);
List structFields=new ArrayList();
//创建结构域
StructField structField1=DataTypes.createStructField(“week”,DataTypes.IntegerType,true);
StructField structField2=DataTypes.createStructField(“年”,DataTypes.IntegerType,true);
//将结构域添加到列表中
structFields.add(structField1);
structFields.add(structField2);
//从StructFields创建StructType。这将用于创建数据帧
StructType schema=DataTypes.createStructType(structFields);
DataFrame df=sqlContext.createDataFrame(myRDD,schema);
DataFrame df2=df.带列(“年”和“周”),concat(col(“年”),lit(“”),col(“周”))
.withColumn(“月”),month(unix_时间戳(col(“yearAndWeek”),“yyyy w”).cast((“时间戳”)).drop(“yearAndWeek”);
df2.show();
}
}
实际上,您创建了一个年和周格式为“yyyy w”的新列,然后使用unix\u时间戳对其进行转换,您可以从中提取您所看到的月份

PS:spark 1.5-


因此,在这种情况下,更一般的做法是执行
.cast(“double”).cast(“timestamp”)

那么跨两个月的几周呢?week不是派生月份的弱变量吗?在我的例子中,它只是增加时间而不改变月份和年份。请看一看你没有正确地复制代码,所以请检查你的代码!