Apache Spark 2.0.0 PySpark手动数据帧创建头部刮擦

时间:2016-10-05 10:27:08

标签: python apache-spark dataframe

当我按如下方式组装一行数据帧时,我的方法成功地恢复了预期的数据帧。

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)

如果我将“terminate_datetime”更改为“end_datetime”或“finish_datetime”,如下所示,则会抛出错误。

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)

我收到的错误是

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

我可以将“terminate_datetime”更改为“start_datetime”并尝试使用其他词语。

我认为没有理由更改字段名称会破坏此代码,因为它只是构建一个手动数据框。

这令人担忧,因为我使用数据框来加载数据仓库,而我无法控制字段名称。

我在Fedora 20上运行Python 3.3.2上的PySpark。

1 个答案:

答案 0 :(得分:1)

为什么名称改变了事情?问题是Row是由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)

这不再匹配您定义的需要Row的架构。

由于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

虽然创建一个单独的元素AVCaptureVideoPreviewLayer看起来很奇怪,如果没有意义的话。