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

如何从CSV文件创建架构并将该架构持久化/保存到文件中?

姬俊能
2023-03-14

我有10列的CSV文件。半字符串和半字符串是整数。

Scala代码的作用是:

  • 创建(推断)模式

到目前为止,我有:

import org.apache.spark.sql.SQLContext

val sqlContext = new SQLContext(sc)
val df = sqlContext.read
    .format("com.databricks.spark.csv")
    .option("header", "true") // Use first line of all files as header
    .option("inferSchema", "true") // Automatically infer data types
    .load("cars.csv")

保存该模式的最佳文件格式是什么?是JSON吗?

目标是-我只想创建一次模式,下次从文件加载时,而不是动态地重新创建它。

谢谢。

共有1个答案

谢洛城
2023-03-14

DataTypeAPI提供了所有必需的实用程序,因此JSON是一个自然的选择:

import org.apache.spark.sql.types._
import scala.util.Try

val df = Seq((1L, "foo", 3.0)).toDF("id", "x1", "x2")
val serializedSchema: String = df.schema.json


def loadSchema(s: String): Option[StructType] =
  Try(DataType.fromJson(s)).toOption.flatMap {
    case s: StructType => Some(s)
    case _ => None 
  }

loadSchema(serializedSchema)

根据您的要求,您可以使用标准的Scala方法将其写入文件,或破解Spark RDD:

val schemaPath: String = ???

sc.parallelize(Seq(serializedSchema), 1).saveAsTextFile(schemaPath)
val loadedSchema: Option[StructType] = sc.textFile(schemaPath)
  .map(loadSchema)  // Load
  .collect.headOption.flatten  // Make sure we don't fail if there is no data

有关Python等效项,请参阅配置文件以在PySpark中定义JSON模式结构

 类似资料:
  • 我正在处理非常长的嵌套JSON文件中的数据。问题是,这些文件的结构并不总是相同的,因为有些文件缺少其他文件的列。我想从一个包含所有列的空JSON文件创建一个定制模式。如果我稍后将JSON文件读入这个预定义的模式,不存在的列将被空值填充(至少计划是这样的)。到目前为止我所做的: 将测试 JSON(不包含预期的所有列)加载到数据帧中 将其架构写入 JSON 文件 在文本编辑器中打开此 JSON 文件并

  • 我有2个数据文件: 1个文件是头文件,另一个是数据文件。头文件有2列(Id,标记):头。txt文件 现在我试图创建一个dataFrame Schema头文件:(我必须使用这种方法,因为在实时,有1000列header.txtdata.txt.所以,手动创建1000列的案例类是不可能的。 但是上面的行失败了,无法解决重载方法结构类型。 有人能帮忙吗

  • Cloudera留档,显示了一种“使用Avro模式文件创建Avro支持的Hive表”的简单方法。这很好。我想对Parque支持的Hive表做同样的事情,但是在这种情况下,相关的留档列出了每种列类型,而不是从模式中读取。是否可以像Avro数据一样从模式中读取Parque列?

  • 我目前使用的是带有hibernate3-maven-plugin的Hibernate 3.6.9。我使用目标hbm2ddl来生成一个sql模式文件。 该插件不支持Hibernate 4.1.2。如何生成架构文件?

  • 我用的是Flink 1.4.0 我正在尝试将Table API查询的结果保存到CSV文件,但我收到错误。以下是详细信息: 我的输入文件如下所示: 我对此运行查询以仅选择犬类,我想将其保存到csv文件中: 当我运行此命令时,我看到数据集的结果被输出: 犬科动物,2 然而,我在输出文件中没有得到任何结果,我在下面看到了这些错误。我能做些什么来解决这个问题?谢谢

  • 我正在开发一个用JAAS进行身份验证的Java应用程序,应该如下工作:(I)当用户的票证已经在本地缓存中时,它应该在不询问凭据的情况下对用户进行身份验证,(ii)当缓存中没有“uclient”的票证时,它应该请求用户名/密码,并将获取的票证保存到本地缓存中。 我的应用程序能够执行“i”,但不能执行“ii”,它正确地验证用户(创建主题/主体),但不会将Krb票证持久保存到缓存中。 问题 我如何实现/