복붙노트

[SCALA] 어떻게 지정된 스키마와 빈 DataFrame를 만드는 방법?

SCALA

어떻게 지정된 스키마와 빈 DataFrame를 만드는 방법?

나는 스칼라의 지정된 스키마를 DataFrame에 만들려고합니다. 내가 JSON 읽기를 사용하는 것을 시도했다 (I 빈 파일을 읽는 의미)하지만 난 그게 가장 좋은 방법은 생각하지 않습니다.

해결법

  1. ==============================

    1.다음 스키마 데이터 프레임을한다고 가정하자 :

    다음 스키마 데이터 프레임을한다고 가정하자 :

    root
     |-- k: string (nullable = true)
     |-- v: integer (nullable = false)
    

    당신은 단순히 데이터 프레임에 대한 스키마를 정의하고 빈 RDD [행]를 사용 :

    import org.apache.spark.sql.types.{
        StructType, StructField, StringType, IntegerType}
    import org.apache.spark.sql.Row
    
    val schema = StructType(
        StructField("k", StringType, true) ::
        StructField("v", IntegerType, false) :: Nil)
    
    // Spark < 2.0
    // sqlContext.createDataFrame(sc.emptyRDD[Row], schema) 
    spark.createDataFrame(sc.emptyRDD[Row], schema)
    

    PySpark 당량 거의 동일하다 :

    from pyspark.sql.types import StructType, StructField, IntegerType, StringType
    
    schema = StructType([
        StructField("k", StringType(), True), StructField("v", IntegerType(), False)
    ])
    
    # or df = sc.parallelize([]).toDF(schema)
    
    # Spark < 2.0 
    # sqlContext.createDataFrame([], schema)
    df = spark.createDataFrame([], schema)
    

    튜플 같은 제품 유형 (스칼라 만) 암시 적 인코더를 사용하여 :

    import spark.implicits._
    
    Seq.empty[(String, Int)].toDF("k", "v")
    

    또는 경우 클래스 :

    case class KV(k: String, v: Int)
    
    Seq.empty[KV].toDF
    

    또는

    spark.emptyDataset[KV].toDF
    
  2. ==============================

    2.스파크 2.0.0로, 다음을 수행 할 수 있습니다.

    스파크 2.0.0로, 다음을 수행 할 수 있습니다.

    의는 사람의 경우 클래스를 정의 할 수 있습니다 :

    scala> case class Person(id: Int, name: String)
    defined class Person
    

    가져 오기 스파크 SparkSession 암시 인코더 :

    scala> import spark.implicits._
    import spark.implicits._
    

    그리고 빈 데이터 집합 [사람]을 만들 SparkSession를 사용 :

    scala> spark.emptyDataset[Person]
    res0: org.apache.spark.sql.Dataset[Person] = [id: int, name: string]
    

    당신은 또한 (org.apache.spark.sql.ColumnName에 DataFrames에 대한 지원 기능 참조) 스키마 "DSL"을 사용할 수 있습니다.

    scala> val id = $"id".int
    id: org.apache.spark.sql.types.StructField = StructField(id,IntegerType,true)
    
    scala> val name = $"name".string
    name: org.apache.spark.sql.types.StructField = StructField(name,StringType,true)
    
    scala> import org.apache.spark.sql.types.StructType
    import org.apache.spark.sql.types.StructType
    
    scala> val mySchema = StructType(id :: name :: Nil)
    mySchema: org.apache.spark.sql.types.StructType = StructType(StructField(id,IntegerType,true), StructField(name,StringType,true))
    
    scala> import org.apache.spark.sql.Row
    import org.apache.spark.sql.Row
    
    scala> val emptyDF = spark.createDataFrame(sc.emptyRDD[Row], mySchema)
    emptyDF: org.apache.spark.sql.DataFrame = [id: int, name: string]
    
    scala> emptyDF.printSchema
    root
     |-- id: integer (nullable = true)
     |-- name: string (nullable = true)
    
  3. ==============================

    3.

    import scala.reflect.runtime.{universe => ru}
    def createEmptyDataFrame[T: ru.TypeTag] =
        hiveContext.createDataFrame(sc.emptyRDD[Row],
          ScalaReflection.schemaFor(ru.typeTag[T].tpe).dataType.asInstanceOf[StructType]
        )
      case class RawData(id: String, firstname: String, lastname: String, age: Int)
      val sourceDF = createEmptyDataFrame[RawData]
    
  4. ==============================

    4.여기 스칼라에 StructType를 사용하여 스키마를 생성하고 그래서 당신이 할 수 빈 테이블을 생성 할 빈 RDD를 전달할 수 있습니다. 코드에 이어 같은입니다.

    여기 스칼라에 StructType를 사용하여 스키마를 생성하고 그래서 당신이 할 수 빈 테이블을 생성 할 빈 RDD를 전달할 수 있습니다. 코드에 이어 같은입니다.

    import org.apache.spark.SparkConf
    import org.apache.spark.SparkContext
    import org.apache.spark.sql._
    import org.apache.spark.sql.Row
    import org.apache.spark.sql.SparkSession
    import org.apache.spark.sql.types.StructType
    import org.apache.spark.sql.types.StructField
    import org.apache.spark.sql.types.IntegerType
    import org.apache.spark.sql.types.BooleanType
    import org.apache.spark.sql.types.LongType
    import org.apache.spark.sql.types.StringType
    
    
    
    //import org.apache.hadoop.hive.serde2.objectinspector.StructField
    
    object EmptyTable extends App {
      val conf = new SparkConf;
      val sc = new SparkContext(conf)
      //create sparksession object
      val sparkSession = SparkSession.builder().enableHiveSupport().getOrCreate()
    
      //Created schema for three columns 
       val schema = StructType(
        StructField("Emp_ID", LongType, true) ::
          StructField("Emp_Name", StringType, false) ::
          StructField("Emp_Salary", LongType, false) :: Nil)
    
          //Created Empty RDD 
    
      var dataRDD = sc.emptyRDD[Row]
    
      //pass rdd and schema to create dataframe
      val newDFSchema = sparkSession.createDataFrame(dataRDD, schema)
    
      newDFSchema.createOrReplaceTempView("tempSchema")
    
      sparkSession.sql("create table Finaltable AS select * from tempSchema")
    
    }
    
  5. ==============================

    5.여기 pyspark 2.0.0 이상에서 빈 dataframe를 생성하는 솔루션입니다.

    여기 pyspark 2.0.0 이상에서 빈 dataframe를 생성하는 솔루션입니다.

    from pyspark.sql import SQLContext
    sc = spark.sparkContext
    schema = StructType([StructField('col1', StringType(),False),StructField('col2', IntegerType(), True)])
    sqlContext.createDataFrame(sc.emptyRDD(), schema)
    
  6. ==============================

    6.자바 버전은 빈 데이터 집합을 만들 수 있습니다 :

    자바 버전은 빈 데이터 집합을 만들 수 있습니다 :

    public Dataset<Row> emptyDataSet(){
    
        SparkSession spark = SparkSession.builder().appName("Simple Application")
                    .config("spark.master", "local").getOrCreate();
    
        Dataset<Row> emptyDataSet = spark.createDataFrame(new ArrayList<>(), getSchema());
    
        return emptyDataSet;
    }
    
    public StructType getSchema() {
    
        String schemaString = “column1 column2 column3 column4 column5”;
    
        List<StructField> fields = new ArrayList<>();
    
        StructField indexField = DataTypes.createStructField(“column0”, DataTypes.LongType, true);
        fields.add(indexField);
    
        for (String fieldName : schemaString.split(" ")) {
            StructField field = DataTypes.createStructField(fieldName, DataTypes.StringType, true);
            fields.add(field);
        }
    
        StructType schema = DataTypes.createStructType(fields);
    
        return schema;
    }
    
  7. ==============================

    7.스파크 2.4.3의로

    스파크 2.4.3의로

    val df = SparkSession.builder().getOrCreate().emptyDataFrame
    
  8. from https://stackoverflow.com/questions/31477598/how-to-create-an-empty-dataframe-with-a-specified-schema by cc-by-sa and MIT license