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
Dataframe 数据帧定义是延迟计算_Dataframe_Apache Spark_Pyspark_Rdd_Lazy Evaluation - Fatal编程技术网

Dataframe 数据帧定义是延迟计算

Dataframe 数据帧定义是延迟计算,dataframe,apache-spark,pyspark,rdd,lazy-evaluation,Dataframe,Apache Spark,Pyspark,Rdd,Lazy Evaluation,我是新的火花和学习它。有人能帮我回答下面的问题吗 spark definitive中关于数据帧定义的引用是“一般来说,spark只会在作业执行时失败,而不是在数据帧定义时失败,即使, 例如,我们指向一个不存在的文件。这是由于延迟计算造成的,“ 所以我猜spark.read.format().load()是数据帧定义。在这个创建的数据框架之上,我们应用转换和操作,如果我没有错的话,加载是读取API而不是转换 我试图在load中使用“不存在的文件”,我认为这是数据帧定义。但我犯了以下错误。根据这本书

我是新的火花和学习它。有人能帮我回答下面的问题吗

spark definitive中关于数据帧定义的引用是“一般来说,spark只会在作业执行时失败,而不是在数据帧定义时失败,即使, 例如,我们指向一个不存在的文件。这是由于延迟计算造成的,“

所以我猜
spark.read.format().load()
是数据帧定义。在这个创建的数据框架之上,我们应用转换和操作,如果我没有错的话,加载是读取API而不是转换

我试图在load中使用“不存在的文件”,我认为这是数据帧定义。但我犯了以下错误。根据这本书,它不应该失败,对吗?。我肯定错过了什么。有人能帮忙吗

df=spark.read.format('csv')
.option('header', 
'true').option('inferschema', 'true')
.load('/spark_df_data/Spark-The-Definitive-Guide/data/retail-data/by-day/2011-12-19.csv')
错误

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/hdp/current/spark2-client/python/pyspark/sql/readwriter.py", line 166, in load
    return self._df(self._jreader.load(path))
  File "/usr/hdp/current/spark2-client/python/lib/py4j-0.10.6-src.zip/py4j/java_gateway.py", line 1160, in __call__
  File "/usr/hdp/current/spark2-client/python/pyspark/sql/utils.py", line 69, in deco
    raise AnalysisException(s.split(': ', 1)[1], stackTrace)
pyspark.sql.utils.AnalysisException: u'Path does not exist: /spark_df_data/Spark-The-Definitive-Guide/data/retail-data/by-day/2011-12-19.csv;' 
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/hdp/current/spark2 client/python/pyspark/sql/readwriter.py”,第166行,装入
返回self.\u df(self.\u jreader.load(路径))
文件“/usr/hdp/current/spark2 client/python/lib/py4j-0.10.6-src.zip/py4j/java_gateway.py”,第1160行,在__
文件“/usr/hdp/current/spark2 client/python/pyspark/sql/utils.py”,第69行,deco格式
引发分析异常(s.split(“:”,1)[1],stackTrace)
pyspark.sql.utils.AnalysisException:u'Path不存在:/spark\u df\u data/spark最终指南/data/retail data/by day/2011-12-19.csv;'

为什么数据帧定义在评估为惰性时引用Hadoop元数据?

Spark是一种惰性演化。然而,这并不意味着它在加载文件时无法验证文件是否存在

延迟演化发生在DataFrame对象上,为了创建DataFrame对象,他们需要首先检查文件是否存在

检查以下各项


在此之前,定义了dataframe并实例化了reader对象

scala> spark.read.format("csv").option("header",true).option("inferschema",true)
res2: org.apache.spark.sql.DataFrameReader = org.apache.spark.sql.DataFrameReader@7aead157
当你真的说加载时

res2.load('/spark\u df\u data/spark The definal Guide/data/retail data/by day/2011-12-19.csv')
文件不存在是执行时间。(这意味着它必须检查数据源,然后从csv加载数据)

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/hdp/current/spark2-client/python/pyspark/sql/readwriter.py", line 166, in load
    return self._df(self._jreader.load(path))
  File "/usr/hdp/current/spark2-client/python/lib/py4j-0.10.6-src.zip/py4j/java_gateway.py", line 1160, in __call__
  File "/usr/hdp/current/spark2-client/python/pyspark/sql/utils.py", line 69, in deco
    raise AnalysisException(s.split(': ', 1)[1], stackTrace)
pyspark.sql.utils.AnalysisException: u'Path does not exist: /spark_df_data/Spark-The-Definitive-Guide/data/retail-data/by-day/2011-12-19.csv;' 
为了获取dataframe,它将检查hadoop的元数据,因为它将检查hdfs是否存在该文件

这不意味着你会得到什么

org.apache.spark.sql.AnalysisException: Path does not exist: hdfs://203-249-241:8020/spark_df_data/Spark-The-Definitive-Guide/data/retail-data/by-day/2011-12-19.csv
大体上

1) RDD/数据帧沿袭将在定义时创建且不会执行。 2) 执行load时,它将是执行时间

请参阅下面的流程以更好地理解


总结:任何交易(定义时间以你的方式)都不会执行,直到调用操作(执行时间以你的方式)

谢谢,洛特,我明白你的意思了。但是你能告诉我这本教科书的引用在哪里适用吗。“一般来说,Spark只会在作业执行时失败,而不是在数据帧定义时失败,即使我们指向一个不存在的文件。这是由于延迟评估造成的,”使用元数据检查某些内容。所以,如果您尝试对不存在的列进行筛选。它将为您提供新的数据帧。您可以应用更多的过滤器,加入这个数据帧,它将不会失败,直到您调用一些操作。(即收集、展示等)