Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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
来自列表的数据帧<;字符串>;在爪哇 Spark版本:1.6.2 Java版本:7_Java_Apache Spark_Spark Dataframe - Fatal编程技术网

来自列表的数据帧<;字符串>;在爪哇 Spark版本:1.6.2 Java版本:7

来自列表的数据帧<;字符串>;在爪哇 Spark版本:1.6.2 Java版本:7,java,apache-spark,spark-dataframe,Java,Apache Spark,Spark Dataframe,我有一个列表数据。比如: [[dev, engg, 10000], [karthik, engg, 20000]..] 我知道这个数据的模式 name (String) degree (String) salary (Integer) 我试过: JavaRDD<String> data = new JavaSparkContext(sc).parallelize(datas); DataFrame df = sqlContext.read().json(data); df.pr

我有一个
列表
数据。比如:

[[dev, engg, 10000], [karthik, engg, 20000]..]
我知道这个数据的模式

name (String)
degree (String)
salary (Integer)

我试过:

JavaRDD<String> data = new JavaSparkContext(sc).parallelize(datas);
DataFrame df = sqlContext.read().json(data);
df.printSchema();
df.show(false);
因为
List
不是正确的JSON


我是否需要创建一个合适的JSON,或者是否有其他方法可以做到这一点?

在Scala上,任务可以在没有JSON的情况下完成:

val data = List("dev, engg, 10000", "karthik, engg, 20000")
val intialRdd = sparkContext.parallelize(data)
val splittedRDD = intialRdd.map(current => {
  val array = current.split(",")
  (array(0), array(1), array(2))
})
import sqlContext.implicits._
val dataframe = splittedRDD.toDF("name", "degree", "salary")
dataframe.show()
输出为:

+-------+------+------+
|   name|degree|salary|
+-------+------+------+
|    dev|  engg| 10000|
|karthik|  engg| 20000|
+-------+------+------+

注意:(array(0)、array(1)、array(2))是一个Scala元组

您可以从
列表
创建数据帧,然后使用
selectExpr
split
获得所需的数据帧

public class SparkSample{
public static void main(String[] args) {
    SparkConf conf = new SparkConf().setAppName("SparkSample").setMaster("local[*]");
    JavaSparkContext jsc = new JavaSparkContext(conf);
    SQLContext sqc = new SQLContext(jsc);
    // sample data
    List<String> data = new ArrayList<String>();
    data.add("dev, engg, 10000");
    data.add("karthik, engg, 20000");
    // DataFrame
    DataFrame df = sqc.createDataset(data, Encoders.STRING()).toDF();
    df.printSchema();
    df.show();
    // Convert
    DataFrame df1 = df.selectExpr("split(value, ',')[0] as name", "split(value, ',')[1] as degree","split(value, ',')[2] as salary");
    df1.printSchema();
    df1.show(); 
   }
}
您提供的示例数据有空格。如果要删除空格并将薪资类型设置为“整数”,则可以使用下面的
trim
cast
函数

df1 = df1.select(trim(col("name")).as("name"),trim(col("degree")).‌​as("degree"),trim(co‌​l("salary")).cast("i‌​nteger").as("salary"‌​)); 
DataFrame createNGramDataFrame(JavaRDD行){
javarddrows=lines.map(新函数(){
私有静态最终长serialVersionUID=-4332903997027358601L;
@凌驾
公用行调用(字符串行)引发异常{
返回RowFactory.create(line.split(\\s+));
}
});
StructType架构=新StructType(新StructField[]{
新结构域(“单词”,
DataTypes.createArrayType(DataTypes.StringType),false,
Metadata.empty())});
DataFrame wordDF=newsqlcontext(jsc).createDataFrame(行,模式);
//构建二元语言模型
NGram transformer=新NGram().setInputCol(“文字”)
.setOutputCol(“ngrams”).setN(2);
DataFrame ngramDF=transformer.transform(wordDF);
ngramDF.show(10,假);
返回ngramDF;
}

为什么不创建包含这些属性的Java bean类,然后创建ArrayList,然后使用sqlContext.createDataFrame(列表数据,类beanClass)创建dataframe。@abaghel创建Java bean类不可能用于每一组数据。此外,中的教程还介绍了如何手动定义架构,而不是使用不那么可靠的toDF。
root
 |-- value: string (nullable = true)

+--------------------+
|               value|
+--------------------+
|    dev, engg, 10000|
|karthik, engg, 20000|
+--------------------+

root
 |-- name: string (nullable = true)
 |-- degree: string (nullable = true)
 |-- salary: string (nullable = true)

+-------+------+------+
|   name|degree|salary|
+-------+------+------+
|    dev|  engg| 10000|
|karthik|  engg| 20000|
+-------+------+------+
df1 = df1.select(trim(col("name")).as("name"),trim(col("degree")).‌​as("degree"),trim(co‌​l("salary")).cast("i‌​nteger").as("salary"‌​)); 
DataFrame createNGramDataFrame(JavaRDD<String> lines) {
 JavaRDD<Row> rows = lines.map(new Function<String, Row>(){
    private static final long serialVersionUID = -4332903997027358601L;

    @Override
    public Row call(String line) throws Exception {
        return RowFactory.create(line.split("\\s+"));
    }
 });
 StructType schema = new StructType(new StructField[] {
        new StructField("words",
                DataTypes.createArrayType(DataTypes.StringType), false,
                Metadata.empty()) });
 DataFrame wordDF = new SQLContext(jsc).createDataFrame(rows, schema);
 // build a bigram language model
 NGram transformer = new NGram().setInputCol("words")
        .setOutputCol("ngrams").setN(2);
 DataFrame ngramDF = transformer.transform(wordDF);
 ngramDF.show(10, false);
 return ngramDF;
}