从Scala中的字符串列表使用自定义名称在循环中创建数据框

时间:2019-02-20 04:07:24

标签: scala apache-spark dataframe dynamic apache-spark-sql

嘿,我有一个典型的要求,即必须在scala中的字符串列表中使用自定义名称在循环中创建数据帧。

就像我有一个字符串说(产品,客户,订单等)的列表,此列表可以有n个项目,其中n可以是30之前的任何数字。每个项目的列列表中的in在另一个文件中指定。

因此,对于列表中的每个项目(例如“产品”),我必须创建数据框名称作为“产品”,然后,我需要编写spark SQL,将该列表中的所有项目连接起来,如下所示。

选择产品名称,客户名称,订单名称 从产品加入客户...加入订单...

并且此联接查询将基于列表中的项目数而动态变化。我正在考虑从shell脚本创建.scala文件。让我知道您的建议。

2 个答案:

答案 0 :(得分:0)

也可以从Scala对象创建动态SQL。根据用户输入,首先创建一个RDD。 然后根据您的要求创建目标对象列表,并创建数据框和对象名称的映射。然后使用循环生成SQL String。

答案 1 :(得分:0)

嘿,我通过创建一个称为generateDF的方法来实现这一点,如下所示。这是将文件列表作为字符串(“,”分隔),将具有模式定义(“,”)的文件分隔,最后是将包含数据的文件。

def generateDF(fName: String, schemaFile: String, dataFile: String): Unit = {
// Reading the prod files and creating DataFrame from user defined schema
val SchemaRDD = spark.sparkContext.textFile(schemaFile)
val SchemaString = SchemaRDD.map(_.toString).collect().mkString
val Schema = StructType(SchemaString.split(",").map(column => StructField(column.split(":")(0), inferType(column), true)))
val outDF = spark.read.format("csv")
  .option("delimiter", ",").option("quote", "")
  .option("header", "false")
  .schema(Schema)
  .load(dataFile)
outDF.createTempView(fName)

}

//为源文件中的每个表名调用过程

fileListRDD
      .flatMap(_.split(",")).collect.toList
      .map(file => generateDF(file.mkString.toString, (filePath + file.mkString + ".schema"), (filePath + file.mkString + ".csv")))