嘿,我有一个典型的要求,即必须在scala中的字符串列表中使用自定义名称在循环中创建数据帧。
就像我有一个字符串说(产品,客户,订单等)的列表,此列表可以有n个项目,其中n可以是30之前的任何数字。每个项目的列列表中的in在另一个文件中指定。
因此,对于列表中的每个项目(例如“产品”),我必须创建数据框名称作为“产品”,然后,我需要编写spark SQL,将该列表中的所有项目连接起来,如下所示。
选择产品名称,客户名称,订单名称 从产品加入客户...加入订单...
并且此联接查询将基于列表中的项目数而动态变化。我正在考虑从shell脚本创建.scala文件。让我知道您的建议。
答案 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")))