在spark scala

时间:2017-09-29 06:43:29

标签: scala apache-spark join spark-dataframe

我有两个文本文件,我正在创建数据框。除了一列之外,两个文件都具有相同的列数。

当我创建架构并加入两者时,我得到错误,如

  

java.lang.ArrayIndexOutOfBoundsException

基本上我的架构有列,而我的文本文件只有5列。

如何将一些空值附加到已创建的模式然后再加入?

这是我的代码

val schema = StructType(Array(
  StructField("TimeStamp", StringType),
  StructField("Id", StringType),
  StructField("Name", StringType),
  StructField("Val", StringType),
  StructField("Age", StringType),
  StructField("Dept", StringType)))

val textRdd1 = sc.textFile("s3://test/Text1.txt")
val rowRdd1 = textRdd1.map(line => Row.fromSeq(line.split(",", -1)))
var df1 = sqlContext.createDataFrame(rowRdd1, schema)

val textRdd2 = sc.textFile("s3://test/Text2.txt")
val rowRdd2 = textRdd2.map(line => Row.fromSeq(line.split(",", -1)))
var df2 = sqlContext.createDataFrame(rowRdd2, schema)

val df3 = df1.join(df2)

第一个文本文件中没有TimeStamp列...

3 个答案:

答案 0 :(得分:0)

为什么不直接从第一个DataFrame的架构中排除TimeStamp字段?

val df1 = sqlContext.createDataFrame(rowRdd1, new StructType(schema.tail.toArray))

正如评论中所提到的,您不需要相似的模式。您还可以指定加入条件并选择要加入的列。

答案 1 :(得分:0)

您可以创建没有此字段的新架构,并使用此架构。 Dmitri建议的是使用原始模式并删除您不需要保存第二个模式定义的字段。

将2个文件加载到数据集中后,在公共字段中执行JOIN基础并删除重复列,我想这就是您想要的,执行此操作:

df3 = df1.join(df2, (df1("Id") === df2("Id")) && (df1("Name") === df2("Name")) && (df1("Val") === df2("Val")) && (df1("Age") === df2("Age")) && (df1("Dept") === df2("Dept")))
.drop(df2("Id"))
.drop(df2("Name"))
.drop(df2("Val"))
.drop(df2("Age"))
.drop(df2("Dept"))

答案 2 :(得分:0)

将Timestamp列添加到第一个数据框

 import spark.sql.functions._
 import org.apache.spark.sql.types.DataType 
 val df1Final = df1.withColumn("TimeStamp", lit(null).cast(Long))

然后继续加入