RDD&データセット&DATAFRAME

 

 

データセットを作成します。

オブジェクトDatasetCreation { 
  DEFメイン(引数:配列[文字列]):単位= { 
    ヴァルスパーク= SparkSession 
      .builder()
      .appName( "SparkSessionTest")
      .getOrCreate()

    インポートspark.implicits._ 

    // 1:範囲
    ヴァルのDS1 = spark.range(0、10、2、2)
    ds1.show()

    ヴァル犬=配列(ドッグ( "jitty"、 "赤")、犬( "mytty"、 "黄"))
    ヴァル・猫=配列(新猫( "jitty"、2)、新しい猫( "mytty"、4))

    // 2:从配列[T]中创建
    ヴァルデータ=犬
    ヴァルDS = spark.createDataset(データ)
    ds.show()

    // 3:从RDD [T]中创建
    ヴァルdogRDD = spark.sparkContext.parallelize(イヌ)並列化(犬) 
    のval dogDS = spark.createDataset(dogRDD)
    dogDS。ショー()

    ヴァルcatRDD = spark.sparkContext.parallelize(ネコ)
    //のVal catDSWithoutEncoder = spark.createDataset(catRDD)
    ヴァルcatDS = spark.createDataset(catRDD)(Encoders.bean(classOf [猫]))
    catDS.show()

    //エンコーダ负责JVM对象类型スパークSQL与内部数据类型之间的转换
    ヴァルintDs = SEQ(1、2、3).toDS()は暗黙的に提供される//(spark.implicits.newIntEncoder)
    ヴァル・seqIntDs =配列(SEQ(1)、配列(2)配列(3))。TODS()は暗黙的に提供される//(spark.implicits.newIntSeqEncoder)
    ヴァル・arrayIntDs =配列(配列(1)、アレイ(2)、アレイ(3))。TODSを()/ /暗黙的に提供(spark.implicits.newIntArrayEncoder)

    //支持的エンコーダ有如下:
    Encoders.product //タプルとケースクラス 
    Encoders.scalaBoolean
    Encoders.scalaByte 
    Encoders.scalaDouble
    Encoders.scalaFloat 
    Encoders.scalaInt 
    Encoders.scalaLong 
    Encoders.scalaShort 

    Encoders.bean(classOf [猫])

    spark.stop()
  } 
}

  

データフレームを作成します

インポートorg.apache.spark.sql.types {IntegerType、StringType、StructField、StructType}。
インポートorg.apache.spark.sql {行、SparkSession} 



オブジェクトDataFrameCreation { 
  DEFメイン(引数:配列[文字列]):単位= { 
    ヴァルスパーク= SparkSessionの
      .builder()
      .appName( "SparkSessionTest")
      .getOrCreate()

    // 1:从RDD [A <:商品]中创建、ケースクラス和タプル都是プロダクト的子类
    ヴァルRDD =火花。 sparkContext.textFile( "")。マップ(ライン=> { 
      ヴァルsplitData = line.split( "")
      犬(splitData(0)、splitData(1))
    })

    ヴァルtupleRDD = spark.sparkContext.parallelize(配列( ( "jitty"、2)、( "mytty"、4)))
 
    spark.createDataFrame(RDD)
    spark.createDataFrame(tupleRDD)
 
    ヴァルdogRDD = spark.sparkContext.parallelize(配列(犬( "jitty"、 "赤")、犬( "mytty"、 "黄")))
    ヴァルdogDf = spark.createDataFrame(dogRDD)
    dogDf .SHOW()

    // 2:从配列[<:商品]中创建
    ヴァルdogSeq = SEQ(犬( "jitty"、 "赤")、犬( "mytty"、 "黄"))
    spark.createDataFrame(dogSeq ).SHOW()

    // 3:用RDD [_] +クラス创建、这个クラス是のJava的ビーン
    ヴァルcatRDD = spark.sparkContext.parallelize(配列(新しい猫( "jitty"、2)、新しい猫(「mytty 」、4)))
    //のVal catDf = spark.createDataFrame(catRDD)
    ヴァルcatDf = spark.createDataFrame(catRDD、classOf [猫])
    catDf.show()
    catDf。createOrReplaceTempView( "猫") 
    spark.sql( "catから選択*")。ショー()//属性の順序は猫が固定されていないチェックアウトすることに注意してください

    4 //:RDD [行] +スキーマ作成を使用して
    ヴァルrowSeq = SEQ( "トム、30"、 "ケイティ、46")。マップ(_。スプリット( ""))。マップ(P =>行(P(0)、P(1).trim.toInt ))
    valをrowRDD = spark.sparkContext.parallelize(rowSeq)
    ヴァル・スキーマ= 
          StructType(
              StructField( "名前"、StringType)、偽:: 
                StructField( "年齢"、IntegerType、真)::無記号)
    ヴァルDATAFRAME = spark.createDataFrame (rowRDD、スキーマ)
    dataFrame.printSchema 
    dataFrame.show()

    // 5:从外部数据源中创建
    ヴァルDF = spark.read.json(S "$ {BASE_PATH} /IoT_device_info.json")
    df.show()

    火花.stop()
  } 
}

  

RDD&データセット&DATAFRAME変換

パッケージcom.twq.dataset.creation 
インポートcom.twq.dataset.Dog 
インポートorg.apache.spark.rdd.RDDの
インポートorg.apache.spark.sql {行、SparkSession} 


オブジェクトRDDDatasetTransform { 
  DEFメイン(引数:配列[文字列]):単位= { 
    ヴァルスパーク= SparkSession 
      .builder()
      .appName( "RDDDatasetTransform")
      .getOrCreate()

    ヴァル犬= SEQ(犬( "jitty"、 "赤")、犬( "mytty"、「黄"))

    valをdogRDD = spark.sparkContext.parallelize(犬)

    // 1:RDD转データフレームの
    インポートspark.implicits._ 
    ヴァルdogDF = dogRDD.toDF()
    dogDF.show()

    ヴァルrenameSchemaDF = dogRDD.toDF(" FIRST_NAME」 、 "lovest_color") 
    renameSchemaDF.show()

    // 2:DATAFRAME转道路、スキーマ信息丢掉了
    ヴァルdogRowRDD:EET [行] = dogDF.rdd 
    dogRowRDD.collect()
    renameSchemaDF.rdd.collect()

    // 3:EET转データセット
    ヴァルdogDS = dogRDD.toDS()
    dogDS.show()

    // 4:データセット转EET 
    ヴァルdogRDDFromDs:EET [犬] = dogDS.rdd 
    dogRDDFromDs.collect()

    // 5:DATAFRAME转データセット
    ヴァルdogDsFromDf = dogDF.as [犬] 
    dogDsFromDf.show()

    / / 6:データセット转DATAFRAME 
    ヴァルdogDfFromDs = dogDsFromDf.toDF()
    dogDfFromDs.show()

    spark.stop()
  } 
}

  

複雑なデータ型と使用のスキーマ定義

インポートorg.apache.spark.sql.types._ 
。インポートorg.apache.spark.sql {行、SaveMode、SparkSession} 




オブジェクトSchemaApiTest { 
  DEFメイン(引数:配列[文字列]):単位= { 
    ヴァルスパーク= SparkSession 
      。ビルダー()
      .appName( "SchemaApiTest")
      管理組織のビー玉( "ローカル")
      .getOrCreate()


    ヴァルiotDeviceDf = spark.read.json(S "$ {BASE_PATH} /IoT_device_info.json")

    iotDeviceDf.toString()

    // 1 :スキーマ的展示
    iotDeviceDf.schema 
    iotDeviceDf.printSchema()

    // 2:スキーマ中可以有复杂数据类型
    ヴァルスキーマ= 
      StructType(
        StructField( "名前"、StringType、偽)::
          StructField( "年齢"、IntegerType、真):: 
          StructField(、 "マップ"のMapType(StringType、StringType)、真):: 
          StructField( "アレイ"、のArrayType(StringType)、真):: 
          StructField( "構造体"、
            StructType(配列(StructField( "フィールド1"、StringType)、StructField( "フィールド2"、StringType))))
          ::無記号)

    valの人= 
      spark.sparkContext.parallelize(配列( "トム、30"、 "ケイティ、46" 。))マップ(。。_スプリット( ""))マップ(P => 
        行(P(0)、P(1).trim.toInt、マップ(P(0) - > P(1))、 SEQ(P(0)、P(1))、ロウ( "VALUE1"、 "値2")))
    valをDATAFRAME = spark.createDataFrame(人、スキーマ)
    データフレーム。printSchema 
    dataFrame.show()

    dataFrame.select( "マップ")。コレクト()地図(行=> row.getAs [マップ[文字列、文字列]() "マップ")
    dataFrame.select( "アレイ")。コレクト()マップ( = ROW> row.getAs [配列[文字列]( "アレイ"))
    dataFrame.select( "構造体")。コレクト()地図(行=> row.getAs [行]( "構造体"))


    //スキーマの有用性
    ヴァルexampleSchema新しい新StructType =()。追加( "名前"、StringType).add( "年齢"、IntegerType)
    exampleSchema( "名前")///名情報を抽出し、型
    exampleSchema.fields //すべてのフィールドタイプ情報
    exampleSchema.fieldNames //すべてのフィールド名
    exampleSchema.fieldIndex( "名前")///位置インデックスフィールド

    1 @:寄木細工のファイルスキーマのビュー
    ヴァルsessionDf spark.read.parquet =(S「$ {} BASE_PATH / trackerSession ") 
    sessionDf.schema 
    sessionDf.printSchema()

    // 2:对两个寄木文件的スキーマ是否相同比
    ヴァルchangedSchemaFieldNames = sessionDf.schema.fieldNames.map(フィールド名=> { 
      IF(フィールド名== "pageview_count"){ 
        "pv_count" 
      }他のフィールド名
    })
    sessionDf.toDF (changedSchemaFieldNames:_ *)。write.mode(SaveMode.Overwrite).parquet(S "$ {BASE_PATH} / trackerSession_changeSchema")
    ヴァルschemaChangeSessionDf = spark.read.parquet(S "$ {BASE_PATH} / trackerSession_changeSchema")
    schemaChangeSessionDf.schema 
    schemaChangeSessionDf.printSchema()

    ヴァルoldSchema = sessionDf.schema 

    ヴァルchangeSchema = schemaChangeSessionDf。スキーマ

    oldSchema == falseをchangeSchema // 

    // 3:2つのファイルが同じでないスキーマの寄木細工、団結の必要性
    ヴァルallSessionError 
      = spark.read.parquet(S "$ {BASE_PATH} / trackerSession"、 "$ {BASE_PATH} / trackerSession_changeSchema" S)
    allSessionError.printSchema()
    allSessionError.show()

    ヴァルallSessionRight = sessionDf.toDF(changeSchema.fieldNamesました: _ *)。連合(schemaChangeSessionDf)
    allSessionRight.printSchema()
    allSessionRight.show()

    spark.stop()

  } 
}

  

 

おすすめ

転載: www.cnblogs.com/tesla-turing/p/11489035.html