Scala 镶木地板柱上的火花
对于模式演变,Mergeschema可以在Spark中用于拼花地板文件格式,我在下面对此进行了说明 这是否只支持拼花文件格式或任何其他文件格式,如csv、txt文件 如果在中间添加了新的附加列,我知道Mergeschema会将这些列移到最后 如果列顺序受到干扰,那么Mergeschema是否会在创建列时将列对齐到正确的顺序,或者我们是否需要通过选择所有列来手动执行此操作 评论更新: 例如,如果我有一个如下的模式并创建如下的表-Scala 镶木地板柱上的火花,scala,azure,apache-spark,databricks,Scala,Azure,Apache Spark,Databricks,对于模式演变,Mergeschema可以在Spark中用于拼花地板文件格式,我在下面对此进行了说明 这是否只支持拼花文件格式或任何其他文件格式,如csv、txt文件 如果在中间添加了新的附加列,我知道Mergeschema会将这些列移到最后 如果列顺序受到干扰,那么Mergeschema是否会在创建列时将列对齐到正确的顺序,或者我们是否需要通过选择所有列来手动执行此操作 评论更新: 例如,如果我有一个如下的模式并创建如下的表-spark.sql(“使用DELTA位置'***'”)创建表empem
spark.sql(“使用DELTA位置'***'”)创建表emp
empid,empname,salary=====>001,ABC,10000
,第二天如果我得到以下格式empid,empage,empdept,empname,salary======>001,30,XYZ,ABC,10000
是否在empid、empname、salary列之后添加新列-empage、empdept
?Q:
1.这是否只支持拼花文件格式或任何其他文件格式,如csv、txt文件。
2.如果列顺序受到干扰,那么Mergeschema是否会在创建列时将列对齐到正确的顺序,或者我们是否需要通过选择所有列手动执行此操作
AFAIK合并模式仅由拼花支持,其他格式(如csv、txt)不支持
Mergeschema(spark.sql.parquet.Mergeschema
)将按正确的顺序对齐列,即使它们是分布式的
spark文档中的示例:
更新:您在评论框中给出的真实示例
问:是否会在之后添加新列-empage、empdept
empid、empname、salary列
回答:是的
EMPAGE、EMPDEPT添加在EMPID、EMPNAME、SALARY之后,后跟您的日期列。
请参阅完整示例
package examples
import org.apache.log4j.Level
import org.apache.spark.sql.SaveMode
object CSVDataSourceParquetSchemaMerge extends App {
val logger = org.apache.log4j.Logger.getLogger("org")
logger.setLevel(Level.WARN)
import org.apache.spark.sql.SparkSession
val spark = SparkSession.builder().appName("CSVParquetSchemaMerge")
.master("local")
.getOrCreate()
import spark.implicits._
val csvDataday1 = spark.sparkContext.parallelize(
"""
|empid,empname,salary
|001,ABC,10000
""".stripMargin.lines.toList).toDS()
val csvDataday2 = spark.sparkContext.parallelize(
"""
|empid,empage,empdept,empname,salary
|001,30,XYZ,ABC,10000
""".stripMargin.lines.toList).toDS()
val frame = spark.read.option("header", true).option("inferSchema", true).csv(csvDataday1)
println("first day data ")
frame.show
frame.write.mode(SaveMode.Overwrite).parquet("data/test_table/day=1")
frame.printSchema
val frame1 = spark.read.option("header", true).option("inferSchema", true).csv(csvDataday2)
frame1.write.mode(SaveMode.Overwrite).parquet("data/test_table/day=2")
println("Second day data ")
frame1.show(false)
frame1.printSchema
// Read the partitioned table
val mergedDF = spark.read.option("mergeSchema", "true").parquet("data/test_table")
println("Merged Schema")
mergedDF.printSchema
println("Merged Datarame where EMPAGE,EMPDEPT WERE ADDED AFER EMPID,EMPNAME,SALARY followed by your day column")
mergedDF.show(false)
}
结果:
first day data
+-----+-------+------+
|empid|empname|salary|
+-----+-------+------+
| 1| ABC| 10000|
+-----+-------+------+
root
|-- empid: integer (nullable = true)
|-- empname: string (nullable = true)
|-- salary: integer (nullable = true)
Second day data
+-----+------+-------+-------+------+
|empid|empage|empdept|empname|salary|
+-----+------+-------+-------+------+
|1 |30 |XYZ |ABC |10000 |
+-----+------+-------+-------+------+
root
|-- empid: integer (nullable = true)
|-- empage: integer (nullable = true)
|-- empdept: string (nullable = true)
|-- empname: string (nullable = true)
|-- salary: integer (nullable = true)
Merged Schema
root
|-- empid: integer (nullable = true)
|-- empname: string (nullable = true)
|-- salary: integer (nullable = true)
|-- empage: integer (nullable = true)
|-- empdept: string (nullable = true)
|-- day: integer (nullable = true)
Merged Datarame where EMPAGE,EMPDEPT WERE ADDED AFER EMPID,EMPNAME,SALARY followed by your day column
+-----+-------+------+------+-------+---+
|empid|empname|salary|empage|empdept|day|
+-----+-------+------+------+-------+---+
|1 |ABC |10000 |30 |XYZ |2 |
|1 |ABC |10000 |null |null |1 |
+-----+-------+------+------+-------+---+
目录树:
Q:
1.这是否只支持拼花文件格式或任何其他文件格式,如csv、txt文件。
2.如果列顺序受到干扰,那么Mergeschema是否会在创建列时将列对齐到正确的顺序,或者我们是否需要通过选择所有列手动执行此操作
AFAIK合并模式仅由拼花支持,其他格式(如csv、txt)不支持
Mergeschema(spark.sql.parquet.Mergeschema
)将按正确的顺序对齐列,即使它们是分布式的
spark文档中的示例:
更新:您在评论框中给出的真实示例
问:是否会在之后添加新列-empage、empdept
empid、empname、salary列
回答:是的
EMPAGE、EMPDEPT添加在EMPID、EMPNAME、SALARY之后,后跟您的日期列。
请参阅完整示例
package examples
import org.apache.log4j.Level
import org.apache.spark.sql.SaveMode
object CSVDataSourceParquetSchemaMerge extends App {
val logger = org.apache.log4j.Logger.getLogger("org")
logger.setLevel(Level.WARN)
import org.apache.spark.sql.SparkSession
val spark = SparkSession.builder().appName("CSVParquetSchemaMerge")
.master("local")
.getOrCreate()
import spark.implicits._
val csvDataday1 = spark.sparkContext.parallelize(
"""
|empid,empname,salary
|001,ABC,10000
""".stripMargin.lines.toList).toDS()
val csvDataday2 = spark.sparkContext.parallelize(
"""
|empid,empage,empdept,empname,salary
|001,30,XYZ,ABC,10000
""".stripMargin.lines.toList).toDS()
val frame = spark.read.option("header", true).option("inferSchema", true).csv(csvDataday1)
println("first day data ")
frame.show
frame.write.mode(SaveMode.Overwrite).parquet("data/test_table/day=1")
frame.printSchema
val frame1 = spark.read.option("header", true).option("inferSchema", true).csv(csvDataday2)
frame1.write.mode(SaveMode.Overwrite).parquet("data/test_table/day=2")
println("Second day data ")
frame1.show(false)
frame1.printSchema
// Read the partitioned table
val mergedDF = spark.read.option("mergeSchema", "true").parquet("data/test_table")
println("Merged Schema")
mergedDF.printSchema
println("Merged Datarame where EMPAGE,EMPDEPT WERE ADDED AFER EMPID,EMPNAME,SALARY followed by your day column")
mergedDF.show(false)
}
结果:
first day data
+-----+-------+------+
|empid|empname|salary|
+-----+-------+------+
| 1| ABC| 10000|
+-----+-------+------+
root
|-- empid: integer (nullable = true)
|-- empname: string (nullable = true)
|-- salary: integer (nullable = true)
Second day data
+-----+------+-------+-------+------+
|empid|empage|empdept|empname|salary|
+-----+------+-------+-------+------+
|1 |30 |XYZ |ABC |10000 |
+-----+------+-------+-------+------+
root
|-- empid: integer (nullable = true)
|-- empage: integer (nullable = true)
|-- empdept: string (nullable = true)
|-- empname: string (nullable = true)
|-- salary: integer (nullable = true)
Merged Schema
root
|-- empid: integer (nullable = true)
|-- empname: string (nullable = true)
|-- salary: integer (nullable = true)
|-- empage: integer (nullable = true)
|-- empdept: string (nullable = true)
|-- day: integer (nullable = true)
Merged Datarame where EMPAGE,EMPDEPT WERE ADDED AFER EMPID,EMPNAME,SALARY followed by your day column
+-----+-------+------+------+-------+---+
|empid|empname|salary|empage|empdept|day|
+-----+-------+------+------+-------+---+
|1 |ABC |10000 |30 |XYZ |2 |
|1 |ABC |10000 |null |null |1 |
+-----+-------+------+------+-------+---+
目录树:
例如,如果我有一个如下的模式,并创建如下的表-spark.sql(“使用增量位置“****”)创建表emp),empid,empname,salary=>001,ABC,第二天如果我得到以下格式empid,empage,empdept,empname,salary==>001,30,XYZ,ABC,10000是否在empid,empname之后添加新列-empage,empdept,薪资列?为什么不以上述方式使用您的示例进行尝试?是的,使用示例进行了尝试,并且将列移到最后..只是想检查您是否已经知道..例如,如果我有一个如下的模式,并创建如下的表-spark.sql(“使用增量位置'***''创建表emp”)empid,empname,salary==>001,ABC,10000和第二天如果我得到以下格式empid,empage,empdept,empname,salary==>001,30,XYZ,ABC,10000是否为新列-empage,empdept将添加在empid、empname、salary列之后?为什么不以上述方式使用示例进行尝试?是的,使用示例进行了尝试,并将列移到最后..只是想检查您是否已经知道。。