我在数据积木工作。
我有一个包含500行的 Dataframe ,我想创建两个包含100行的 Dataframe ,另一个包含剩余的400行。
+--------------------+----------+
| userid| eventdate|
+--------------------+----------+
|00518b128fc9459d9...|2017-10-09|
|00976c0b7f2c4c2ca...|2017-12-16|
|00a60fb81aa74f35a...|2017-12-04|
|00f9f7234e2c4bf78...|2017-05-09|
|0146fe6ad7a243c3b...|2017-11-21|
|016567f169c145ddb...|2017-10-16|
|01ccd278777946cb8...|2017-07-05|
我已尝试以下操作,但收到错误
df1 = df[:99]
df2 = df[100:499]
TypeError: unexpected item type: <type 'slice'>
7条答案
按热度按时间bzzcjhmw1#
一开始我误解了,以为你想对列进行切片,如果你想选择行的子集,一种方法是使用
monotonically_increasing_id()
创建一个索引列。生成的ID保证单调递增且唯一,但不连续。
您可以使用此ID对 Dataframe 进行排序,并使用
limit()
将其划分为子集,以确保您得到的正是所需的行。例如:
只是为了验证这是否符合您的要求:
我们还可以验证索引列是否不重叠:
uxhixvfz2#
Spark Dataframe 不能像你写的那样被索引。你可以使用head方法来创建n个最前面的行。这将返回一个Row()对象的列表,而不是一个 Dataframe 。所以你可以把它们转换回 Dataframe ,然后使用subtract从原始 Dataframe 中获取其余的行。
如果你使用spark 2.0+,你也可以使用SparkSession代替spark sqlContext。如果你对前100行不感兴趣,你想随机拆分,你可以这样使用randomSplit:
goucqfw63#
如果我不介意两个 Dataframe 中有相同的行,那么我可以使用
sample
。例如,我有一个354行的 Dataframe 。或者,如果我想严格拆分而不出现重复项,我可以
sauutmhj4#
试着这样做:
对此也类似:
yyyllmsg5#
在这两种解决方案中,我认为我们需要将第二句中的
df1
更改为df1_list
,并将df2
更改为df2_list
。nfeuvbwi6#
下面是我按行对 Dataframe 进行切片的解决方案:
h79rfbju7#
在此提供一个简单得多的解决方案,更接近于所要求的解决方案:
(在Spark 2.4 +中工作)