Scala 镶木地板柱上的火花

Scala 镶木地板柱上的火花,scala,azure,apache-spark,databricks,Scala,Azure,Apache Spark,Databricks,对于模式演变,Mergeschema可以在Spark中用于拼花地板文件格式,我在下面对此进行了说明 这是否只支持拼花文件格式或任何其他文件格式,如csv、txt文件 如果在中间添加了新的附加列,我知道Mergeschema会将这些列移到最后 如果列顺序受到干扰,那么Mergeschema是否会在创建列时将列对齐到正确的顺序,或者我们是否需要通过选择所有列来手动执行此操作 评论更新: 例如,如果我有一个如下的模式并创建如下的表-spark.sql(“使用DELTA位置'***'”)创建表empem

对于模式演变,Mergeschema可以在Spark中用于拼花地板文件格式,我在下面对此进行了说明

这是否只支持拼花文件格式或任何其他文件格式,如csv、txt文件

如果在中间添加了新的附加列,我知道Mergeschema会将这些列移到最后

如果列顺序受到干扰,那么Mergeschema是否会在创建列时将列对齐到正确的顺序,或者我们是否需要通过选择所有列来手动执行此操作

评论更新: 例如,如果我有一个如下的模式并创建如下的表-
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列之后?为什么不以上述方式使用示例进行尝试?是的,使用示例进行了尝试,并将列移到最后..只是想检查您是否已经知道。。