当我按如下方式组装一行数据帧时,我的方法成功地恢复了预期的数据帧。
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。
答案 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
看起来很奇怪,如果没有意义的话。