【问题标题】:Creating dataframe in a loop with custom name from a list of string in scala从scala中的字符串列表中使用自定义名称在循环中创建数据框
【发布时间】:2019-07-13 16:34:56
【问题描述】:

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

就像我有一个字符串列表说(产品,客户,订单,......),这个列表可以有 n 个项目,其中 n 可以是任何数字,比如直到 30。还有每个项目的列在列表中指定在另一个文件中。

因此,对于列表中的每个项目,例如 Product,我必须将数据框名称创建为 Product,稍后我需要编写 spark SQL 连接该列表中的所有项目,如下所示。

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

并且此连接查询将根据列表中的项目数动态进行。我正在考虑从 shell 脚本创建 .scala 文件。让我知道你的建议。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      嘿,我通过创建一个名为 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")))
      

      【讨论】:

      • 对于动态 SQL,我们可以使用 StringBuilder 对象并附加循环/映射函数
      猜你喜欢
      • 2017-11-10
      • 1970-01-01
      • 2019-04-08
      • 2021-07-09
      • 2020-08-19
      • 1970-01-01
      • 2022-01-21
      • 2019-01-24
      • 1970-01-01
      相关资源
      最近更新 更多