由于我是新手,所以我有一个简单的疑问我必须创建一个空的数据框,稍后必须根据某些条件进行填充。
我经历了创建一个空数据框的许多问题,但是下面这些方法之间有什么区别我所采用的方法我不知道这是否正确
def function1(df: DataFrame): DataFrame = {
var newdf:DataFrame= null;
if(!x._2(0).column.trim.isEmpty){
newdf= spark.sql("SELECT f_name,l_name FROM tab1");
}else{
newdf= spark.sql("SELECT address,zipcode FROM tab1");
}
newdf
}
以上方法在本地运行时不会给我带来任何错误,不知道何时涉及集群。但是我发现了其他方法,他们用指定的模式创建了一个空的数据框,如下所示:
val my_schema = StructType(Seq(
StructField("field1", StringType, nullable = false),
StructField("field2", StringType, nullable = false)
))
val empty: DataFrame = spark.createDataFrame(spark.sparkContext.emptyRDD[Row], my_schema)
但是我的问题是我没有预定义的架构,并且结果数据框可能是任何与运行时相关的架构,而我不知道该架构的外观。
如果我采用方法1或我遗漏的任何东西,是否有任何问题。
尝试避免使用vars的语法。数据框是不可变的集合,Scala允许创建表达式以创建数据框。类似于以下代码:
def function2(df0: DataFrame)(spark: SparkSession): DataFrame = {
val df = {
if(!x._2(0).column.trim.isEmpty){
spark.sql("SELECT f_name,l_name FROM tab1")
} else {
spark.sql("SELECT address,zipcode FROM tab1")
}
}
df
}
您可以从字符串数组创建数据帧,其中每个元素都是列名:
val columnNames: List[String] = List("column1", "column2")
// All dataframe columns are of type string
val schema = columnNames.map(StructField(_, StringType, nullable = true))
spark.createDataFrame(spark.sparkContext.emptyRDD[Row], schema)
如果还有另一个更复杂的用例,请编辑问题并添加更具体的内容...