2016-10-05 4 views
1

次のように1行のデータフレームをアセンブルすると、私のメソッドは正常にデータフレームを返します。それがエラーをスロー以下のように、私は「end_datetime」または「finish_datetime」を「terminate_datetime」に変更した場合Apache Spark 2.0.0 PySparkマニュアルデータフレーム作成ヘッドスクラッチャー

def build_job_finish_data_frame(sql_context, job_load_id, is_success): 
    job_complete_record_schema = StructType(
     [ 
      StructField("job_load_id", IntegerType(), False), 
      StructField("terminate_datetime", TimestampType(), False), 
      StructField("was_success", BooleanType(), False) 
     ] 
    ) 
    data = [ 
     Row(
      job_load_id=job_load_id, 
      terminate_datetime=datetime.now(), 
      was_success=is_success 
     ) 
    ] 

    return sql_context.createDataFrame(data, job_complete_record_schema) 

def build_job_finish_data_frame(sql_context, job_load_id, is_success): 
    job_complete_record_schema = StructType(
     [ 
      StructField("job_load_id", IntegerType(), False), 
      StructField("end_datetime", TimestampType(), False), 
      StructField("was_success", BooleanType(), False) 
     ] 
    ) 
    data = [ 
     Row(
      job_load_id=job_load_id, 
      end_datetime=datetime.now(), 
      was_success=is_success 
     ) 
    ] 

    return sql_context.createDataFrame(data, job_complete_record_schema) 

私は受信エラーは、私が "start_datetime" に "terminate_datetime" を変更することができますし、他の言葉で実験している

TypeError: IntegerType can not accept object datetime.datetime(2016, 10, 5, 11, 19, 31, 915745) in type <class 'datetime.datetime'> 

です。

手動のデータフレームを構築する以上のことは何もしていないので、このコードを破るフィールド名の変更の理由はわかりません。

これは、私がフィールド名を制御できないデータウェアハウスをロードするためにデータフレームを使用しているので心配です。

名は、物事を変えるなぜ私はFedoraの20

答えて

1

でPython 3.3.2上でPySparkを実行しているのですか?問題はがtupleであり、__fields__であることです。二つ目は、作成しながら、だから、最初のケースは

from pyspark.sql import Row 
from datetime import datetime 

x = Row(job_load_id=1, terminate_datetime=datetime.now(), was_success=True) 
x.__fields__ 
## ['job_load_id', 'terminate_datetime', 'was_success'] 

作成しません:

y = Row(job_load_id=1, end_datetime=datetime.now(), was_success=True) 
y.__fields__ 
## ['end_datetime', 'job_load_id', 'was_success'] 

これはもはや(IntegerType, TimestampType, Boolean)を期待していますが、定義されたスキーマと一致しました。

はほとんどスキーマ推論のために有用であり、あなたが標準tupleを使用していることに対処することができ、直接スキーマを提供するので:

def build_job_finish_data_frame(sql_context, job_load_id, is_success): 
    job_complete_record_schema = StructType(
     [ 
      StructField("job_load_id", IntegerType(), False), 
      StructField("end_datetime", TimestampType(), False), 
      StructField("was_success", BooleanType(), False) 
     ] 
    ) 
    data = [tuple(job_load_id, datetime.now(), is_success)] 

    return sql_context.createDataFrame(data, job_complete_record_schema) 

を単一の要素DataFrameを作成することは奇妙でない場合は無意味に見えますが。

関連する問題