我有两个文本文件,我正在创建数据框。除了一列之外,两个文件都具有相同的列数。
当我创建架构并加入两者时,我得到错误,如
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列...
答案 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))
然后继续加入