使用架构信息加载文件,并使用Spark

时间:2019-06-26 19:32:20

标签: scala apache-spark apache-spark-sql bigdata

我不想使用推断模式和标头选项。唯一的方法是我应该读取仅包含列标题的文件,并应动态使用它来创建数据框。

我正在使用Spark 2,并使用用户定义的架构加载单个csv文件,但我想动态处理,因此,一旦我仅提供架构文件的路径,它将读取该内容并将其用作该文件的标头数据,并使用架构文件中提供的架构将其转换为数据框。

假设我提供的文件夹中包含2个文件。一个文件仅包含数据,头不是强制性的。第二个文件将具有架构(列名)。因此,我必须先阅读架构文件,然后阅读包含数据的文件,并且必须将架构应用于数据文件并在数据框中显示它。

小示例,schema.txt包含:

Custid,Name,Product

数据文件具有:

1,Ravi,Mobile

1 个答案:

答案 0 :(得分:1)

根据您的评论,我假设架构文件仅包含列名称,并且格式类似于csv文件(列名称为标头且没有任何数据)。列类型将从实际的数据文件中推断出来,而架构文件未指定。

在这种情况下,最简单的解决方案是将架构文件读取为csv,并将标头设置为true。这将给出一个空的数据框,但带有正确的头。然后读取数据文件,并将默认列名称更改为架构数据框中的名称。

val schemaFile = ...
val dataFile = ...    

val colNames = spark.read.option("header", true).csv(schemaFile).columns
val df = spark.read
  .option("header", "false")
  .option("inferSchema", "true")
  .csv(dataFile)
  .toDF(colNames: _*)