【发布时间】:2019-07-05 02:50:49
【问题描述】:
我想将 Dataset 中具有 2018-08-17T19:58:46.000+0000 之类的值的时间戳字段映射为 2018-08-17 19:58:46.000 之类的格式,即 yyyy-MM-dd HH:mm:ss.SSS,以及一些列到yyyy-MM-dd。
例如,我有一个数据集 DS1,其中包含 id、lastModif、created 列:
+------------------+----------------------------+----------------------------+
|Id |lastModif |created |
+------------------+----------------------------+----------------------------+
|abc1 |2019-01-14T19:51:55.000+0000|2019-02-07T20:37:53.000+0000|
|AQA2 |2019-02-05T19:26:36.000+0000|2019-02-07T20:40:06.000+0000|
+------------------+----------------------------+----------------------------+
从上面的 DS1 我需要将 lastModif 列映射到格式 yyyy-MM-dd HH:mm:ss.SSS 和 createdTime 列映射到 yyyy-MM-dd。
我有类似的 DS2、DS3,但列映射不同。
我保留了一个属性文件,它将从中获取映射列作为键和时间戳格式作为值。
在代码中,我保留了映射列和非映射列的列表,并选择了列:
String cols = "Id,created,lastModif";
String[] colArr = cols.split(",");
String mappedCols = "lastModif,created"; //hardcoding as of now.
List<String> mappedColList = Arrays.asList(mappedCols.split(","));
String nonMappedCols = getNonMappingCols(colArr, mappedCols.split(",")).toLowerCase();
List<String> nonMapped = Arrays.asList(nonMappedCols.split(","));
//column-mapping logic
filtered = tempDS.selectExpr(convertListToSeq(nonMapped),unix_timestamp($"lastModif","yyyy-MM-dd HH:mm:ss.SSS").cast("timestamp").as("lastModif"));
filtered.show(false);
public static Seq<String> convertListToSeq(List<String> inputList)
{
return JavaConverters.asScalaIteratorConverter(inputList.iterator()).asScala().toSeq();
}
private static String getNonMappingCols(String[] cols, String[] mapped)
{
String nonMappedCols = "";
List<String> mappedList = Arrays.asList(mapped);
for(int i=0; i<cols.length; i++)
{
if(!mappedList.contains(cols[i])){
nonMappedCols += cols[i]+",";
}
}
nonMappedCols = nonMappedCols.substring(0, nonMappedCols.length()-1);
return nonMappedCols;
}
如何将列映射到所需的时间戳格式?
在tempDS.selectExpr(convertListToSeq(nonMapped),unix_timestamp($"lastModif","yyyy-MM-dd HH:mm:ss.SSS").cast("timestamp").as("lastModif")); 代码行中,$"lastModif" 在 Java 中是无法识别的。
其次,这种方式是一种静态方式,即硬编码映射列。如何映射我的 List<String> mappedColList 中的列?
【问题讨论】:
-
你试过用
new Column("lastModif")代替$"lastModif"吗? -
是的。它给出编译错误“unix_timestamp(Column,String) undefined”
-
我试过
org.apache.spark.sql.functions.unix_timestamp(tempDS.col("lastModif"),"yyyy-MM-dd HH:mm:ss.SSS")...编译器错误消失了,但我的数据是yyyy-MM-ddTHH:mm:ss.SSS+Z类型的字符串,例如:2019-02-07T20:37:53.000+0000,它被解析为null。
标签: java apache-spark apache-spark-sql