Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将Spark数据帧转换为Pojo对象_Java_Apache Spark_Apache Spark Sql - Fatal编程技术网

Java 将Spark数据帧转换为Pojo对象

Java 将Spark数据帧转换为Pojo对象,java,apache-spark,apache-spark-sql,Java,Apache Spark,Apache Spark Sql,请参阅以下代码: //Create Spark Context SparkConf sparkConf = new SparkConf().setAppName("TestWithObjects").setMaster("local"); JavaSparkContext javaSparkContext = new JavaSparkContext(sparkConf); //Creating RDD JavaRDD<Person> pers

请参阅以下代码:

    //Create Spark Context
    SparkConf sparkConf = new SparkConf().setAppName("TestWithObjects").setMaster("local");
    JavaSparkContext javaSparkContext = new JavaSparkContext(sparkConf);
    //Creating RDD
    JavaRDD<Person> personsRDD = javaSparkContext.parallelize(persons);
    //Creating SQL context
    SQLContext sQLContext = new SQLContext(javaSparkContext);
    DataFrame personDataFrame = sQLContext.createDataFrame(personsRDD, Person.class);
    personDataFrame.show();
    personDataFrame.printSchema();
    personDataFrame.select("name").show();
    personDataFrame.registerTempTable("peoples");
    DataFrame result = sQLContext.sql("SELECT * FROM peoples WHERE name='test'");
    result.show();
//创建Spark上下文
SparkConf SparkConf=新的SparkConf().setAppName(“TestWithObjects”).setMaster(“本地”);
JavaSparkContext JavaSparkContext=新的JavaSparkContext(sparkConf);
//创建RDD
JavaRDD personsRDD=javaSparkContext.parallelize(persons);
//创建SQL上下文
SQLContext SQLContext=新的SQLContext(javaSparkContext);
DataFrame personDataFrame=sQLContext.createDataFrame(personsRDD,Person.class);
personDataFrame.show();
personDataFrame.printSchema();
personDataFrame.select(“name”).show();
personDataFrame.RegisterEmptable(“人民”);
DataFrame result=sQLContext.sql(“从人名='test'中选择*);
result.show();

在此之后,我需要将数据帧-‘result’转换为Person对象或列表。提前感谢。

一个
数据帧
存储为
s,因此您可以使用。看看
get
方法。

DataFrame只是Dataset[Row]的一个类型别名。与强类型Scala/Java数据集附带的“类型化转换”不同,这些操作也被称为“非类型化转换”

在spark中,从Dataset[Row]到Dataset[Person]的转换非常简单

DataFrame result=sQLContext.sql(“从人名中选择*,其中name='test'”)

此时,Spark将数据转换为DataFrame=Dataset[Row],这是一个通用Row对象的集合,因为它不知道确切的类型

// Create an Encoders for Java beans
Encoder<Person> personEncoder = Encoders.bean(Person.class); 
Dataset<Person> personDF = result.as(personEncoder);
personDF.show();
//为Java bean创建编码器
编码器personEncoder=Encoders.bean(Person.class);
数据集personDF=result.as(personEncoder);
personDF.show();
现在,Spark转换Dataset[Row]->Dataset[Person]类型特定的Scala/Java JVM对象,由类Person指定

有关更多详细信息,请参阅databricks提供的以下链接


正如这些方法所给出的,我们只能按值获取每个值,而不能作为一个整体object@DonMathew在这一点上你不会得到更好的结果。如果更容易的话,您可以转换为JSON并从那里开始。即将推出的
DataSet
API应该或多或少地满足您的需求,尽管我不确定POJO现在是否不需要解码器。似乎编码器尝试设置所有类参数,而不仅仅是构造函数中的参数。例如,在上述情况下,如果我有一个类似
class a{int p1 int p2 public a(int p1){this.p1=p1 this.p2=p1*2}}
int的类,编码器要求p1和p2在奇数数据帧中可用。