通过在两列之间添加空列来使用现有数据集创建新数据集

时间:2019-01-04 06:42:22

标签: java apache-spark apache-spark-sql

我通过读取一个csv文件,使用Java在Spark中创建了一个数据集。以下是我的初始数据集:

+---+----------+-----+---+
|_c0|       _c1|  _c2|_c3|
+---+----------+-----+---+
|  1|9090999999|NANDU| 22|
|  2|9999999999| SANU| 21|
|  3|9999909090| MANU| 22|
|  4|9090909090|VEENA| 23|
+---+----------+-----+---+

我想按如下方式创建数据框(一列具有空值):

+---+----+--------+
|_c0| _c1|     _c2|
+---+----|--------+
|  1|null|   NANDU|
|  2|null|    SANU|
|  3|null|    MANU|
|  4|null|   VEENA|
+---+----|--------+

以下是我现有的代码:

Dataset<Row> ds  = spark.read().format("csv").option("header", "false").load("/home/nandu/Data.txt");
Column [] selectedColumns = new Column[2];
selectedColumns[0]= new Column("_c0");
selectedColumns[1]= new Column("_c2");
ds2 = ds.select(selectedColumns);

它将创建如下的数据集。

+---+-----+
|_c0|  _c2|
+---+-----+
|  1|NANDU|
|  2| SANU|
|  3| MANU|
|  4|VEENA|
+---+-----+

3 个答案:

答案 0 :(得分:2)

要选择所需的两列并添加一个包含空值的新列,可以使用以下命令:

import org.apache.spark.sql.functions.*;
import org.apache.spark.sql.types.StringType;

ds.select({col("_c0"), lit(null).cast(DataTypes.StringType).as("_c1"), col("_c2")});

答案 1 :(得分:1)

尝试以下代码

import org.apache.spark.sql.functions.{ lit => flit}
import org.apache.spark.sql.types._
val ds = spark.range(100).withColumn("c2",$"id")
ds.withColumn("new_col",flit(null: String)).selectExpr("id","new_col","c2").show(5)

希望有帮助

干杯:)

答案 2 :(得分:1)

添加具有字符串null值的新列可以解决该问题。尝试使用以下代码,尽管它是用scala编写的,但是您会明白的:

select * from TableA 
where userID = x and itemID in 
(select itemID from TableB
where categoryID = y)