使用spark而不使用动态框架(粘合上下文)读取粘合目录



由于我们的方案是恒定的,我们使用spark.read((,当数据存储在s3 中时,它比从选项创建动态帧快得多

所以现在想从胶水目录中读取数据使用动态帧需要花费大量时间所以想使用spark-read-api进行读取Dataframe.read.format("(.option("url","(.option("dtable",schema.table name(.load((

在格式和url选项中输入什么以及其他需要的东西??

简短回答:

如果您直接使用SparkSession/SparkContext读取/加载数据,您将获得纯Spark DataFrame,而不是DynamicFrame。

从火花中读取时的不同选项:

  • 格式:是您正在读取的源格式,因此它可以是parquet、csv、json等
  • load:它是您正在读取的源文件的路径:它可以是本地路径、s3路径、hadoop路径
  • 选项:如果你想让spark对你最好,并根据csv文件中的数据样本或header=true猜测模式,那么有很多不同的选项,比如inferSchema

一个例子:

df = spark.read.format("csv").option("header", true) .option("inferSchema", true).load("s3://path")

在前面的示例中没有创建DynamicFrame,所以df将是DataFrame,除非您使用胶水API将其转换为DynamicFrame。


长答案:

Glue目录本身只是一个aws-Hive实现。如果需要,您可以创建一个定义模式、读取器类型和映射的glue目录,然后它可以用于不同的aws服务,如glue、athena或redshift spectrum。我从使用粘合目录中看到的唯一好处实际上是与不同aws服务的集成。

我认为您可以使用爬虫和与athena和redshift-specturm的集成,以及使用统一的API将它们加载到粘合作业中,从而最大限度地利用数据目录。

您总是可以使用from_options glue方法直接从不同的源和格式使用glue进行读取,并且您不会丢失glue拥有的一些很棒的工具,它仍然会将其作为DynamicFrame进行读取。

如果您出于任何原因不想从胶水中获取数据,您只需指定一个DataFrame Schema并使用SparkSession直接读取即可,但请记住,尽管您可以将该DataFrame转换为DynamicFrame,但您将无法访问书签和其他工具。

使用spark直接从s3读取DataFrame(例如,parquet、json或csv格式(的示例如下:

df = spark.read.parquet("s3://path/file.parquet")
df = spark.read.csv("s3a://path/*.csv")
df= spark.read.json("s3a://path/*.json")

这不会创建任何DynamicFrame,除非你想将其转换为它,否则你会得到一个纯Spark DataFrame。

另一种方法是使用format()方法。

df = spark.read.format("csv").option("header", true) .option("inferSchema", true).load("s3://path")

请记住,有几个选项,如";标题";或";推断模式";对于csv f.e,您需要知道是否要使用它们。最佳做法是在生产环境中定义模式,而不是使用inferSchema,但有几个用例。

此外,如果需要,您可以随时使用将纯DataFrame转换为DynamicFrame

DynamicFrame.fromDF(df, glue_context, ..)

最新更新