Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 火花拼花模式演变_Apache Spark_Parquet - Fatal编程技术网

Apache spark 火花拼花模式演变

Apache spark 火花拼花模式演变,apache-spark,parquet,Apache Spark,Parquet,我有一个分区的hdfs拼花地板位置,它有不同的模式,不同的分区 假设第一个分区有5列,第二个分区有4列。现在我尝试读取基本拼花地板路径,然后过滤第二个分区 这在DF中给了我5列,尽管我在第二分区的拼花文件中只有4列。 当我直接读取第二个分区时,它给出了正确的4列。如何解决这个问题。我真的很想帮助你,但我不确定你到底想要实现什么。你的意图是什么 如果您想读取包含所有分区的拼花地板文件,并且只想获得两个分区的列,那么读取选项mergeSchema可能适合您的需要 与ProtocolBuffer、Av

我有一个分区的hdfs拼花地板位置,它有不同的模式,不同的分区

假设第一个分区有5列,第二个分区有4列。现在我尝试读取基本拼花地板路径,然后过滤第二个分区

这在DF中给了我5列,尽管我在第二分区的拼花文件中只有4列。
当我直接读取第二个分区时,它给出了正确的4列。如何解决这个问题。

我真的很想帮助你,但我不确定你到底想要实现什么。你的意图是什么

如果您想读取包含所有分区的拼花地板文件,并且只想获得两个分区的列,那么读取选项mergeSchema可能适合您的需要

与ProtocolBuffer、Avro和Thrift一样,Parquet也支持模式演化。用户可以从一个简单的模式开始,然后根据需要逐渐向该模式添加更多的列。通过这种方式,用户可能最终得到具有不同但相互兼容模式的多个拼花文件。拼花数据源现在能够自动检测这种情况并合并所有这些文件的模式

因为模式合并是一个相对昂贵的操作,并且不是一个简单的过程 在大多数情况下,我们默认从 1.5.0. 您可以在读取拼花地板文件时将数据源选项mergeSchema设置为true来启用它,如下面的示例所示,或者 将全局SQL选项spark.SQL.parquet.mergeSchema设置为true


因此,您使用的spark版本以及spark.sql.parquet.mergeSchema spark设置和mergeSchema客户端属性的设置都很有趣,我很想告诉您,但我不确定您到底想要实现什么。你的意图是什么

如果您想读取包含所有分区的拼花地板文件,并且只想获得两个分区的列,那么读取选项mergeSchema可能适合您的需要

与ProtocolBuffer、Avro和Thrift一样,Parquet也支持模式演化。用户可以从一个简单的模式开始,然后根据需要逐渐向该模式添加更多的列。通过这种方式,用户可能最终得到具有不同但相互兼容模式的多个拼花文件。拼花数据源现在能够自动检测这种情况并合并所有这些文件的模式

因为模式合并是一个相对昂贵的操作,并且不是一个简单的过程 在大多数情况下,我们默认从 1.5.0. 您可以在读取拼花地板文件时将数据源选项mergeSchema设置为true来启用它,如下面的示例所示,或者 将全局SQL选项spark.SQL.parquet.mergeSchema设置为true


因此,您使用的spark版本以及属性spark.sql.parquet.mergeSchema spark设置和mergeSchema client的设置方式都很有趣

您可以在读取拼花文件时指定所需的schema4列

然后spark只读取模式中包含的字段,如果数据中不存在字段,则返回null。 例如:


您可以在读取拼花地板文件时指定所需的schema4列

然后spark只读取模式中包含的字段,如果数据中不存在字段,则返回null。 例如:


我正在应用我自己的模式,但在第二个分区中只有4列可用。我正在读取具有多个分区的基本目录。我的DF模式有5个col,而分区1文件有5个模式。即使只过滤了分区2,我的DFL中仍然有5个col,而阅读时,您是否添加了.schema,然后读取了拼花地板目录?只有在指定.schema选项时,parquet才会提取指定模式的数据,否则它将读取所有字段!不,我不知道;不能在读取自身时添加模式。它推断模式,然后我将其转换为rdd,进行一些处理,最后使用模式创建一个数据帧。在这个模式中,我只给出了4列,但是rdd已经有了5列。所以,如果我有100列,那么数据将从第5列移位。我正在应用我自己的模式,但在第2个分区中只有4列可用。我正在读取具有多个分区的基本目录。我的DF模式有5个col,而分区1文件有5个模式。即使只过滤了分区2,我的DFL中仍然有5个col,而阅读时,您是否添加了.schema,然后读取了拼花地板目录?只有在指定.schema选项时,parquet才会提取指定模式的数据,否则它将读取所有字段!不,我不知道;不能在读取自身时添加模式。它推断模式,然后我将其转换为rdd,进行一些处理,最后使用模式创建一个数据帧。在这个模式中,我只给出了4列,但是rdd已经有了5列。所以如果我有100列的话,数据会从第5列移位。我只需要在所有分区中通用的模式
. 分区1有5个列,分区2有4个列,所以当我读取此文件时,我应该在DF中只得到4个列,因为分区1中的第5列在分区2中不可用,但我在DF中得到5个列,即使在过滤DF使其只有分区2。但是分区2内的实际拼花文件没有第5列,spark inserts null为这一列,这是我不想要的。当我过滤分区2okay时,我只需要在我的DF中输入4个col,现在我得到了你,我认为解决这个问题最简单、最可靠的方法就是@Shu刚才所说的。但它不是通用的,我喜欢通用的、可重用的解决方案。在读取分区拼花地板文件时,您是否已经查看了mergeSchema选项?我无法给出.schema和read bcz,我将在读取后转换为rdd并处理数据,最后,我将再次使用此模式转换为DF。到目前为止,我已经对直接分区目录进行了修改,在本例中,我没有在DF中获取分区列,所以我手动添加它,但当我读取一个分区时,它给出了正确的模式,该模式仅在该分区内可用,而不像以前的方法,它给出了额外的模式。我只需要在所有分区中通用的模式。分区1有5个列,分区2有4个列,所以当我读取此文件时,我应该在DF中只得到4个列,因为分区1中的第5列在分区2中不可用,但我在DF中得到5个列,即使在过滤DF使其只有分区2。但是分区2内的实际拼花文件没有第5列,spark inserts null为这一列,这是我不想要的。当我过滤分区2okay时,我只需要在我的DF中输入4个col,现在我得到了你,我认为解决这个问题最简单、最可靠的方法就是@Shu刚才所说的。但它不是通用的,我喜欢通用的、可重用的解决方案。在读取分区拼花地板文件时,您是否已经查看了mergeSchema选项?我无法给出.schema和read bcz,我将在读取后转换为rdd并处理数据,最后,我将再次使用此模式转换为DF。到目前为止,我已经对直接分区目录进行了更改,在本例中,我没有在DF中获取分区列,所以我手动添加它,但当我读取一个分区时,它给出了正确的模式,该模式仅在该分区内可用,而不像以前的方法,它给出了额外的模式
import org.apache.spark.sql.types._
import org.apache.spark.sql.functions._

val sch=new StructType().add("i",IntegerType).add("z",StringType)
spark.read.schema(sch).parquet("<parquet_file_path>").show()

//here i have i in my data and not have z field
//+---+----+
//|  i|   z|
//+---+----+
//|  1|null|
//+---+----+