Apache spark 如何在Spark中一行引入模式?

Apache spark 如何在Spark中一行引入模式?,apache-spark,Apache Spark,Java API行中有一个Row.schema(),但没有Row.set(StructType schema) 我还尝试了RowFactorie.create(对象),但我不知道如何继续 更新: 问题在于,当我在示例中修改workers中的结构时,如何生成新的数据帧 DataFrame sentenceData = jsql.createDataFrame(jrdd, schema); List<Row> resultRows2 = sentenceData.toJavaRDD()

Java API行中有一个Row.schema(),但没有Row.set(StructType schema)

我还尝试了RowFactorie.create(对象),但我不知道如何继续

更新:

问题在于,当我在示例中修改workers中的结构时,如何生成新的数据帧

DataFrame sentenceData = jsql.createDataFrame(jrdd, schema);
List<Row> resultRows2 = sentenceData.toJavaRDD()
            .map(new MyFunction<Row, Row>(parameters) {
            /** my map function **// 

                public Row call(Row row) {

                 // I want to change Row definition adding new columns
                    Row newRow = functionAddnewNewColumns (row);
                    StructType newSchema = functionGetNewSchema (row.schema);

                    // Here I want to insert the structure 

                    //
                    return newRow
                    }

                }

        }).collect();


JavaRDD<Row> jrdd = jsc.parallelize(resultRows);

// Here is the problema  I don't know how to get the new schema to create the   new modified dataframe

DataFrame newDataframe = jsql.createDataFrame(jrdd, newSchema);
DataFrame-sentenceData=jsql.createDataFrame(jrdd,schema);
List resultRows2=sentenceData.toJavaRDD()
.map(新的MyFunction(参数){
/**我的地图功能**//
公用行呼叫(行){
//我想更改行定义,添加新列
Row newRow=functionaldnewcolumns(Row);
StructType newSchema=functionGetNewSchema(row.schema);
//我想在这里插入结构
//
返回纽罗
}
}
}).收集();
javarddjrdd=jsc.parallelize(resultRows);
//这里有一个问题,我不知道如何获得新的模式来创建新的修改后的数据帧
DataFrame newDataframe=jsql.createDataFrame(jrdd,newSchema);

您没有在行上设置架构-这毫无意义。但是,您可以使用sqlContext使用给定的模式创建一个
数据帧(或pre-Spark 1.3 a JavaSchemaRDD)

DataFrame dataFrame = sqlContext.createDataFrame(rowRDD, schema)
dataframe
将具有您提供的模式

有关更多信息,请参阅以下网址的文档:

编辑:根据更新的问题

您可以在
映射
-函数中生成新行,该函数将为您获得类型为
JavaRDD
的新
rdd

使用
newSchema
作为模式,从
rowRDD
创建一个新的
DataFrame

DataFrame newDataframe = jsql.createDataFrame(newRowRDD, newSchema)

您可以使用以下命令创建具有架构的行:

Row newRow = new GenericRowWithSchema(values, newSchema);

这是一个非常古老的线程,但我只是有一个用例,我需要使用Spark生成数据,并快速处理行级别的数据,然后从行构建一个新的数据框架。我花了一点时间把它组合起来,也许它会帮助别人

在这里,我们使用一个“模板”行,修改一些数据,添加一个具有适当“行级别”模式的新列,然后使用该新行和模式创建一个具有适当“新模式”的新DF,因此“自下而上”:)这最初是在@Christian answer的基础上构建的,因此提供了一个简化的片段

def fillTemplateRow(row: Row, newUUID:String) = {
  var retSeq = Seq[Any]()
    (row.schema,row.toSeq).zipped.foreach(
      (s,r)=> {
        // println(s"s=${s},r=${r}")
        val retval = s.name match {
          case "uuid" => {
            newUUID
          }
          case _ => r
        }
        retSeq = retSeq :+ retval
      })

  var moreSchema = StructType(List(
    StructField("metadata_id", StringType, true)
  ))

  var newSchema = StructType(templateRow.schema ++ moreSchema)

  retSeq = retSeq :+ "newid"

  var retRow = new GenericRowWithSchema(
    retSeq.toArray,
    newSchema
  ): Row

  retRow
}

var newRow = fillTemplateRow(templateRow, "test-user-1")

var usersDF = spark.createDataFrame(
    spark.sparkContext.parallelize(Seq(newRow)),
    newRow.schema
)

usersDF.select($"uuid",$"metadata_id").show()

欢迎来到SO!请分享一个,这样我们可以试着帮助你。这是一个非常低质量的问题。非常感谢,我刚刚更新了我的问题,我的问题是我试图修改一个数据帧的模式,但我不知道如何将新模式返回给master以生成新的数据帧。我的问题是,我不知道函数映射后的新模式(行->FunctionAddNewColumns(行))。。。在映射函数中定义了newschema(worker),因此此信息在应用程序的一般主作用域中不可用。@Glennie“您没有在行上设置架构-这没有意义。”--为什么不?一行有一个模式:
org.apache.spark.sql.Row.schema()
。我看不出它从根本上与同一个问题有什么不同,只是有一个数据框架。是的,一行有一个模式,但它是从数据框架继承的。不能有包含具有不同架构的行的数据框。
Row newRow = new GenericRowWithSchema(values, newSchema);
def fillTemplateRow(row: Row, newUUID:String) = {
  var retSeq = Seq[Any]()
    (row.schema,row.toSeq).zipped.foreach(
      (s,r)=> {
        // println(s"s=${s},r=${r}")
        val retval = s.name match {
          case "uuid" => {
            newUUID
          }
          case _ => r
        }
        retSeq = retSeq :+ retval
      })

  var moreSchema = StructType(List(
    StructField("metadata_id", StringType, true)
  ))

  var newSchema = StructType(templateRow.schema ++ moreSchema)

  retSeq = retSeq :+ "newid"

  var retRow = new GenericRowWithSchema(
    retSeq.toArray,
    newSchema
  ): Row

  retRow
}

var newRow = fillTemplateRow(templateRow, "test-user-1")

var usersDF = spark.createDataFrame(
    spark.sparkContext.parallelize(Seq(newRow)),
    newRow.schema
)

usersDF.select($"uuid",$"metadata_id").show()