当前位置: 首页 > 知识库问答 >
问题:

Spark SQL—隐式创建模式和

宗政和韵
2023-03-14

我试图理解隐式创建模式之间的确切区别,以及在什么特定场景中可以使用哪种方法

在数据库网站上,信息并不是那么随意

正如我们所看到的,当使用反射(隐式RDD to DF)方式时,我们可以通过使用Map函数从文本文件中选择特定列来创建Case类。

在编程风格中-我们正在加载数据集的文本文件(类似于反射)

创建SchemaString(String)=“知道我们可以指定所需列的文件”(类似于case类的反射方式)

导入ROW API-这将再次映射到特定列

然后我们创建数据帧

http://spark.apache.org/docs/1.5.2/sql-programming-guide.html#inferring-the-schema-using-reflection

http://spark.apache.org/docs/1.5.2/sql-programming-guide.html#programmatically-指定架构

请解释...

共有2个答案

苏磊
2023-03-14

以编程方式指定模式当无法提前定义案例类时(例如,记录的结构被编码为字符串,或者文本数据集将被解析,字段将针对不同的用户以不同的方式投影),可以通过三个步骤以编程方式创建DataFrame。

从原始RDD创建行的RDD;创建由与步骤1中创建的RDD中的行结构匹配的结构类型表示的模式。通过SQLContext提供的createDataFrame方法将模式应用于行的RDD。

例如:

// sc is an existing SparkContext.
val sqlContext = new org.apache.spark.sql.SQLContext(sc)

// Create an RDD
val people = sc.textFile("examples/src/main/resources/people.txt")

// The schema is encoded in a string
val schemaString = "name age"

// Import Row.
import org.apache.spark.sql.Row;

// Import Spark SQL data types
import org.apache.spark.sql.types.{StructType,StructField,StringType};

// Generate the schema based on the string of schema
val schema =
  StructType(
    schemaString.split(" ").map(fieldName => StructField(fieldName, StringType, true)))

// Convert records of the RDD (people) to Rows.
val rowRDD = people.map(_.split(",")).map(p => Row(p(0), p(1).trim))

// Apply the schema to the RDD.
val peopleDataFrame = sqlContext.createDataFrame(rowRDD, schema)

// Register the DataFrames as a table.
peopleDataFrame.registerTempTable("people")

使用反射推断模式SparkSQL的Scala接口支持将包含case类的RDD自动转换为DataFrame。case类定义表的模式。case类的参数名称使用反射读取并成为列的名称。Case类也可以嵌套或包含复杂类型,例如序列或数组。此RDD可以隐式转换为DataFrame,然后注册为表。表可以在后续的SQL语句中使用。

例如:

// sc is an existing SparkContext.
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
// this is used to implicitly convert an RDD to a DataFrame.
import sqlContext.implicits._

// Define the schema using a case class.
// Note: Case classes in Scala 2.10 can support only up to 22 fields. To work around this limit,
// you can use custom classes that implement the Product interface.
case class Person(name: String, age: Int)

// Create an RDD of Person objects and register it as a table.
val people = sc.textFile("examples/src/main/resources/people.txt").map(_.split(",")).map(p => Person(p(0), p(1).trim.toInt)).toDF()
people.registerTempTable("people")
司空镜
2023-03-14

生成的模式是相同的,因此从这个角度来看,没有区别。在这两种情况下,您都为数据提供了一个模式,但在一种情况下,您是从一个case类中进行的,在另一种情况下,您可以使用集合,因为模式是构建为一个结构类型(数组[结构域])。所以它基本上是元组和集合之间的选择。在我看来,最大的区别在于cases类必须在代码中,而通过编程指定模式可以在运行时完成,因此您可以基于运行时读取的另一个数据帧构建模式。例如,我编写了一个通用工具来“嵌套”数据,从CSV读取数据,并将一组前缀字段转换为一个结构数组。由于该工具是通用的,并且模式只有在运行时才知道,所以我使用了编程方法。另一方面,使用反射对其进行编码通常更容易,因为您不必处理所有的StructField对象,因为它们是从配置单元元存储派生的,所以它们的数据类型必须映射到您的scala类型。

 类似资料:
  • 创建型模式(Creational Pattern)对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离。为了使软件的结构更加清晰,外界对于这些对象只需要知道它们共同的接口,而不清楚其具体的实现细节,使整个系统的设计更加符合单一职责原则。 创建型模式在创建什么(What),由谁创建(Who),何时创建(When)等方面都为软件设计者提供了尽可能大的灵活性。创建型模式隐藏了类的实例的

  • 如何将OAuth2 SSO的详细信息获取到我的JWT中?(实例作为返回) 我有... > Angular 6客户端(隐式登录为客户端)(使用) Spring BootOAuth2授权服务器,带有JWT配置,第三方SSO到GitHub 身份验证服务器配置为作为和用于SSO的GitHub客户端 null 直接获得一个,它包含GitHub的所有详细信息(yay) 通过头传递令牌的Angular应用程序间

  • 一、前言 创建型模式 创建型模式(Creational Pattern)对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离。为了使软件的结构更加清晰,外界对于这些对象只需要知道它们共同的接口,而不清楚其具体的实现细节,使整个系统的设计更加符合单一职责原则。 创建型模式在创建什么(What),由谁创建(Who),何时创建(When)等方面都为软件设计者提供了尽可能大的灵活性。创建

  • 问题内容: 我刚开始是猫鼬。我有一个带猫鼬的创建脚本,该脚本用示例数据创建模式和数据库。 现在,我编写实际的应用程序。每次我的应用程序运行时,我是否需要创建模式对象,或者它已经以某种方式可用? 换句话说,我是否需要在每个使用猫鼬访问数据库的应用程序中运行此代码,还是仅在第一次运行此代码: 如果我有设置器/验证器/等,答案将如何变化? 问题答案: 一个定义就是让应用程序理解如何将数据从MongoDB

  • 我将JSON文件&JSON模式解析为AVRO模式。我有点困惑,我是否必须使用AVRO文档中定义的数据类型来编写手动AVRO模式。 或者是否有任何自动化的方法/函数/程序可以完全按照要求工作?

  • 有没有办法将数据帧模式序列化为json并在以后反序列化? 用例很简单:我有一个json配置文件,其中包含我需要读取的数据帧的模式。我希望能够从现有模式(在数据帧中)创建默认配置,并希望能够通过从json字符串读取来生成稍后使用的相关模式。