我正在寻找一个谜.我b"I'm a byte string"在RDD中有一堆长文档可用作Python bytestrings().现在我将此RDD转换为a DataFrame以将其连接到另一个DataFrame.我这样做:
Data_RDD = Paths_RDD.map(open_paths).flatMap(split_files)
Data_schema = StructType([
StructField("URI", StringType(), True),
StructField("Content", StringType(), True),
])
Data_DF = sqlContext.createDataFrame(Data_RDD, schema=Data_schema)
print(Data_DF.show(5))
+--------------------+-----------+
| URI| Content|
+--------------------+-----------+
|http://01storytel...|[B@10628e42|
|http://05yxgs.com...|[B@36699775|
|http://1.lhcmaima...|[B@4e569e3b|
|http://100100.ove...|[B@18ae5bab|
|http://1015theriv...|[B@5f044435|
+--------------------+-----------+
only showing top 5 rows
Run Code Online (Sandbox Code Playgroud)
这些短"[B@10628e42"字符串对我来说似乎毫无用处,可能是某种指针.RDD中的字节串仍然是"完整的",因为我仍然可以访问它们.所以在从RDD转换到DataFrame问题时会发生.现在我尝试将字节串存储在其他类型的字段中,即ByteType()和BinaryType().两者都不起作用,因为这些错误消息不接受字节串:
TypeError: ByteType can not accept object b'some string' in type <class 'bytes'>
TypeError: BinaryType can not accept object b'some string' in type <class 'bytes'>
Run Code Online (Sandbox Code Playgroud)
但它变得更加怪异.当我设置一个小规模的实验时:
ByteStrings …Run Code Online (Sandbox Code Playgroud) 我有一个dataframe,我应用了一个功能.此函数返回numpy array如下代码:
create_vector_udf = udf(create_vector, ArrayType(FloatType()))
dataframe = dataframe.withColumn('vector', create_vector_udf('text'))
dmoz_spark_df.select('lang','url','vector').show(20)
Run Code Online (Sandbox Code Playgroud)
现在火花似乎不满意这个并且不接受ArrayType(FloatType())
我收到以下错误消息:
net.razorvine.pickle.PickleException: expected zero arguments for construction of ClassDict (for numpy.core.multiarray._reconstruct)
我可以只numpyarray.tolist()返回它的列表版本,但显然我总是要重新创建它,array如果我想用它numpy.
那么有没有来存储方式numpy array 的dataframe column?
这将创建我的示例数据框:
df = sc.parallelize([('abc',),('def',)]).toDF() #(
df = df.selectExpr("_1 as one",)
df = df.withColumn("two", lit('z'))
df.show()
Run Code Online (Sandbox Code Playgroud)
看起来像这样:
+---+---+
|one|two|
+---+---+
|abc| z|
|def| z|
+---+---+
Run Code Online (Sandbox Code Playgroud)
现在我想要做的是一系列SQL where like语句,其中two无论匹配是否匹配列
在"伪代码"中它看起来像这样:
for letter in ['a','b','c','d']:
df = df['two'].where(col('one').like("%{}%".format(letter))) += letter
Run Code Online (Sandbox Code Playgroud)
最终导致df看起来像这样:
+---+----+
|one| two|
+---+----+
|abc|zabc|
|def| zd|
+---+----+
Run Code Online (Sandbox Code Playgroud)