Apache spark 如何自动化Spark阅读?

Apache spark 如何自动化Spark阅读?,apache-spark,pyspark,Apache Spark,Pyspark,我需要从S3存储桶中读取150次 df1 = spark.read.json('s3://mybucket/f1') df2 = spark.read.json('s3://mybucket/f2') ... df150 = spark.read.json('s3://mybucket/f150') 如何使这个过程自动化 spark.read.json produces Spark Dataframe. 如果我试一下奥斯卡的建议 import spark your_dfs_list = [s

我需要从S3存储桶中读取150次

df1 = spark.read.json('s3://mybucket/f1')
df2 = spark.read.json('s3://mybucket/f2')
...
df150 = spark.read.json('s3://mybucket/f150')
如何使这个过程自动化

spark.read.json produces Spark Dataframe.
如果我试一下奥斯卡的建议

import spark
your_dfs_list = [spark.read.json("s3://cw-mybuc/RECORDS/FULL_RECEIVED/2020/07/01/00"+str(x)) for x in range(1,38)]

AttributeError: module 'spark' has no attribute 'read'

我认为你应该提供更多的细节。你希望多久阅读一次,原因是什么等。如果你提供一些上下文,我们可能会更好地帮助你

从您的代码片段来看,循环似乎是最容易做到的。并在数组中读取它

list = []

for i in range(150):
  list.append(spark.read.json('s3://mybucket/f' + (i + 1)))
然而,如果你提供更多的细节,我相信这个答案是可以改进的

根据评论进行编辑

如果您希望在数据帧上使用union,最简单的方法是导入隐式:

import spark.implicits._

var df = spark.emptyDataFrame

for i in range(150):
  df = df.union(spark.read.json('s3://mybucket/f' + (i + 1))))
注:这应适用于spark 2.x及以上版本:


我认为你应该提供更多细节。你希望多久阅读一次,原因是什么等。如果你提供一些上下文,我们可能会更好地帮助你

从您的代码片段来看,循环似乎是最容易做到的。并在数组中读取它

list = []

for i in range(150):
  list.append(spark.read.json('s3://mybucket/f' + (i + 1)))
然而,如果你提供更多的细节,我相信这个答案是可以改进的

根据评论进行编辑

如果您希望在数据帧上使用union,最简单的方法是导入隐式:

import spark.implicits._

var df = spark.emptyDataFrame

for i in range(150):
  df = df.union(spark.read.json('s3://mybucket/f' + (i + 1))))
注:这应适用于spark 2.x及以上版本:


我认为您可以使用一个列表理解,它返回一个数据帧列表,然后您可以在那里对它们进行迭代

your_dfs_list = [spark.read.json("s3://mybucket/f"+str(x)) for x in range(1,150)]
我想在Scala中这样做可能更容易在以后的数据帧上应用map或foreach,但这取决于您的偏好:

(1 to 150).map(v => spark.read.json(s"s3://mybucket/f$v"))

我认为您可以使用一个列表理解,它返回一个数据帧列表,从那里您可以对它们进行迭代

your_dfs_list = [spark.read.json("s3://mybucket/f"+str(x)) for x in range(1,150)]
我想在Scala中这样做可能更容易在以后的数据帧上应用map或foreach,但这取决于您的偏好:

(1 to 150).map(v => spark.read.json(s"s3://mybucket/f$v"))
步骤1:创建所有json.gz文件的列表。在spark的当前版本中,.gzip文件是自动读取的,因此这不是问题。如果正在读取S3存储桶中的所有文件,则可以使用:

步骤2:从1开始遍历每个文件,并在移动过程中合并每个结果数据帧。的解决方案版本应能实现以下功能:

# Read first file
df = spark.read.json(fs[0]) 

# Then union the rest
for f in fs[1:]:
  df = df.union(spark.read.json(f))
步骤1:创建所有json.gz文件的列表。在spark的当前版本中,.gzip文件是自动读取的,因此这不是问题。如果正在读取S3存储桶中的所有文件,则可以使用:

步骤2:从1开始遍历每个文件,并在移动过程中合并每个结果数据帧。的解决方案版本应能实现以下功能:

# Read first file
df = spark.read.json(fs[0]) 

# Then union the rest
for f in fs[1:]:
  df = df.union(spark.read.json(f))

我应该进口spark.its吗?列表是python列表吗?这取决于您以后对结果的处理。python列表可能也足够了,您不需要什么花哨的东西。这取决于你想要什么,数据是什么,你想如何处理它。这没关系。问题是我的文件有json.gz格式,但名称不同01-06或21-08。这使得事情变得更加复杂。您可以使用文件名var name=[f01-06,f123]定义一个列表,然后可以在for循环中为它编制索引,而不是在需要名称[i]的情况下使用i+1。或者编写一个算法,给出正确的文件名……如果您计划在大量数据帧上运行union,请注意,这可能会导致Spark执行计划出现较大的沿袭,从而降低性能。为了减少它,在10或20个数据帧的存储桶上运行union,并缓存每个存储桶的结果union我应该导入spark.implicits吗?列表是python列表吗?这取决于您以后对结果的处理。python列表可能也足够了,您不需要什么花哨的东西。这取决于你想要什么,数据是什么,你想如何处理它。这没关系。问题是我的文件有json.gz格式,但名称不同01-06或21-08。这使得事情变得更加复杂。您可以使用文件名var name=[f01-06,f123]定义一个列表,然后可以在for循环中为它编制索引,而不是在需要名称[i]的情况下使用i+1。或者编写一个算法,给出正确的文件名……如果您计划在大量数据帧上运行union,请注意,这可能会导致Spark执行计划出现较大的沿袭,从而降低性能。为了减少这种情况,可以在包含10或20个数据帧的存储桶上运行union,并缓存每个存储桶的union结果。请查看我的编辑,应该解决Python代码中的spark.read。问题是,我的文件具有不同的名称。如何一个接一个地读它们?如果它们的名字完全不同,我的意思是不像f1,f2。。。但像fileA1、anotherName、nameDifferent等一样,您可以用它们的名称准备一个列表,并遍历该列表,而不是范围1150。甚至你可以在数据库中有一个csv或一个表,并通过读取它们创建一个列表。看看我的编辑,spark.read在Python代码中应该得到解决。问题是我的文件有不同的名称。如何一个接一个地读它们?如果它们的名字完全不同,我的意思是不像f1,f2。。。但是像fileA1,另一个名字,名字
不同的,等等,你可以用他们的名字准备一个列表,并遍历该列表而不是范围1150。甚至你可以在数据库中有一个csv或一个表,并通过读取它们创建一个列表。我正在运行Jupyter笔记本上的代码,它调用spark会话。你用什么来运行你的代码?在我的虚拟环境中,ok将从Jupiter尝试..如果我在笔记本上的一个单元格中键入spark.read,那么这就是reader对象我正在从Jupyter笔记本运行代码,它调用spark会话。你用什么来运行你的代码?在我的虚拟EnV中,OK将从Jupiter尝试…如果我打火花。我在笔记本上的一个单元格上读取,这就是读者的目标。这也是一个很好的解决方案,但是你可能需要考虑在很多数据帧上运行一个联合会创建一个大的谱系,并且会使SCAP降低性能。为了防止它,可以考虑在10或20个数据框中使用Union和缓存/ UNACHE每个桶来打破lineage@OscarLopezM. 看来你是对的。我应该添加20乘20的数据帧吗?如何缓存?我不认为有一个像20这样的神奇数字,因为这取决于数据帧的大小、集群资源等。但我认为从这个数字开始并尝试其他数字是值得的。要缓存中间结果,可以在每个结果上都有存储桶后调用cachemethod。此外,请记住在准备好存储桶时调用uncache方法。我之所以这么说是因为它可能会消耗你以后需要的资源来进行进一步的处理,这也是一个很好的解决方案,但是你可能需要考虑在很多数据文件上运行一个联盟会创建一个大的宗族,并且会使SCAP降低性能。为了防止它,可以考虑在10或20个数据框中使用Union和缓存/ UNACHE每个桶来打破lineage@OscarLopezM. 看来你是对的。我应该添加20乘20的数据帧吗?如何缓存?我不认为有一个像20这样的神奇数字,因为这取决于数据帧的大小、集群资源等。但我认为从这个数字开始并尝试其他数字是值得的。要缓存中间结果,可以在每个结果上都有存储桶后调用cachemethod。此外,请记住在准备好存储桶时调用uncache方法。我之所以这么说,是因为它可能会消耗您以后需要进一步处理的资源