我正在尝试创建一个数据框,该数据框的值为空。
val df = Seq(null,null).toDF("a","b")
面对的问题,即使我们使用null.instanceof也没有成功。
val df = Seq(null.asInstanceOf[Integer],null.asInstanceOf[Integer]).toDF("a","b")
这有效,但是我不喜欢指定字段类型,大多数情况下它应该是字符串。
答案 0 :(得分:3)
我假设您想要一个两列DF,在这种情况下,每个条目都应该是一个元组或一个case-class。如果是这种情况,您还可以明确声明Seq
的类型,这样就不必使用asInstanceOf
:
val df = Seq[(Integer, Integer)]((null, null)).toDF("a","b")
答案 1 :(得分:2)
我的首选方式是使用groupBy
:
import org.apache.spark.sql.functions._
val df = Seq(
("table1", "IntColumn", "int", "0"),
("table2", "StringColumn", "string", "2"),
("table1", "StringColumn", "string", "2"),
("table2", "IntColumn", "int", "0"),
("table1", "DecColumn", "decimal(15,2)", "1"),
("table2", "DecColumn", "decimal(15,2)", "1")
).toDF("tablename", "columnname", "datatype", "ordinalposition")
df.
withColumn("columndef",
struct($"ordinalposition", concat($"columnname", lit(" "), $"datatype").as("cdef"))
).
groupBy("tablename").agg(sort_array(collect_list($"columndef")).as("sortedlist")).
withColumn("columndefs", concat_ws(", ", $"sortedlist.cdef")).
drop("sortedlist").
show(false)
// +---------+-----------------------------------------------------------+
// |tablename|columndefs |
// +---------+-----------------------------------------------------------+
// |table2 |IntColumn int, DecColumn decimal(15,2), StringColumn string|
// |table1 |IntColumn int, DecColumn decimal(15,2), StringColumn string|
// +---------+-----------------------------------------------------------+
答案 2 :(得分:0)
看起来像“ asInstanceOf”中的错印,对我来说效果很好:
List(null.asInstanceOf[Integer],null.asInstanceOf[Integer]).toDF("a").show(false)
答案 3 :(得分:0)
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.types.{IntegerType, StructField, StructType}
import org.apache.spark.sql.{DataFrame, Row, SparkSession}
object SparkApp extends App {
val sparkSession: SparkSession = SparkSession.builder()
.appName("Spark_Test_App")
.master("local[2]")
.getOrCreate()
val schema: StructType = StructType(
Array(
StructField("a", IntegerType, nullable = true),
StructField("b", IntegerType, nullable = true)
)
)
import sparkSession.implicits._
val nullRDD: RDD[Row] = Seq((null, null)).toDF("a", "b").rdd
val df: DataFrame = sparkSession.createDataFrame(nullRDD, schema)
df.printSchema()
df.show()
sparkSession.stop()
}