twut/usage.md at main · archivesunleashed/twut · GitHub
Skip to content
Sign up
Why GitHub?
Features →
Mobile →
Actions →
Codespaces →
Packages →
Security →
Code review →
Project management →
Integrations →
GitHub Sponsors →
Customer stories →
Security →
Team
Enterprise
Explore
Explore GitHub →
Learn & contribute
Topics →
Collections →
Trending →
Learning Lab →
Open source guides →
Connect with others
The ReadME Project →
Events →
Community forum →
GitHub Education →
GitHub Stars program →
Marketplace
Pricing
Plans →
Compare plans →
Contact Sales →
Nonprofit →
Education →
In this repository
All GitHub
↵
Jump to
↵
No suggested jump to results
In this repository
All GitHub
↵
Jump to
↵
In this organization
All GitHub
↵
Jump to
↵
In this repository
All GitHub
↵
Jump to
↵
Sign in
Sign up
{{ message }}
archivesunleashed
/
twut
Watch
3
Star
6
Fork
2
Code
Issues
1
Pull requests
0
Actions
Projects
0
Security
Insights
More
Code
Issues
Pull requests
Actions
Projects
Security
Insights
Permalink
main
twut/docs/usage.md
Go to file
Go to file
T
Go to line
L
Copy path
ruebot
Add language extractor; resolves #6.
…
Latest commit
a414dec
Dec 13, 2019
History
- Add extractor for Scala and Python.
- Add test
- Update documentation
2
contributors
Users who have contributed to this file
869 lines (644 sloc)
23.8 KB
Raw
Blame
twut usage
How do I...
Extract tweet ids
Extract tweet language
Extract user information
Extract tweet text
Extract tweet times
Extract tweet sources
Extract hashtags
Extract urls
Extract animated gif urls
Extract image urls
Extract media urls
Extract video urls
Remove sensitive tweets
Remove retweets
Remove non-verified user tweets
Work with DataFrame Results
Extract Tweet IDs
Single-column DataFrame containing Tweet IDs.
Scala DF
import io.archivesunleashed._
val tweets = "src/test/resources/10-sample.jsonl"
val tweetsDF = spark.read.json(tweets)
ids(tweetsDF).show(2, false)
Output:
+-------------------+
|id_str |
+-------------------+
|1201505319257403392|
|1201505319282565121|
+-------------------+
Python DF
from twut import *
path = "src/test/resources/500-sample.jsonl"
df = spark.read.json(path)
SelectTweet.ids(df).show(2, False)
Output:
+-------------------+
|id_str |
+-------------------+
|1201505319257403392|
|1201505319282565121|
+-------------------+
Extract Tweet Language
Single-column DataFrame containing the BCP 47 language identifier corresponding to the machine-detected language.
Scala DF
import io.archivesunleashed._
val tweets = "src/test/resources/10-sample.jsonl"
val tweetsDF = spark.read.json(tweets)
language(tweetsDF).show(5, false)
Output:
+----+
|lang|
+----+
|tl |
|ja |
|ar |
|ja |
|ja |
+----+
Python DF
from twut import *
path = "src/test/resources/500-sample.jsonl"
df = spark.read.json(path)
SelectTweet.language(df).show(5, False)
Output:
+----+
|lang|
+----+
|tl |
|ja |
|ar |
|ja |
|ja |
+----+
Extract User Information
Multi-column DataFrame containing the following columns: favourites_count, followers_count, friends_count, id_str, location, name, screen_name, statuses_count, and verified.
Scala DF
import io.archivesunleashed._
val tweets = "src/test/resources/10-sample.jsonl"
val tweetsDF = spark.read.json(tweets)
userInfo(tweetsDF).show(2, false)
Output:
+----------------+---------------+-------------+-------------------+--------+-------------------+------------+--------------+--------+
|favourites_count|followers_count|friends_count|id_str |location|name |screen_name |statuses_count|verified|
+----------------+---------------+-------------+-------------------+--------+-------------------+------------+--------------+--------+
|8302 |101 |133 |1027887558032732161|nct🌱 |车美 |M_chemei |3720 |false |
|2552 |73 |218 |2548066344 |null |ひーこ☆禿げても愛せ|heeko_gr_029|15830 |false |
+----------------+---------------+-------------+-------------------+--------+-------------------+------------+--------------+--------+
only showing top 2 rows
Python DF
from twut import *
path = "src/test/resources/500-sample.jsonl"
df = spark.read.json(path)
SelectTweet.userInfo(df).show(2, False)
Output:
+----------------+---------------+-------------+-------------------+--------+-------------------+------------+--------------+--------+
|favourites_count|followers_count|friends_count|id_str |location|name |screen_name |statuses_count|verified|
+----------------+---------------+-------------+-------------------+--------+-------------------+------------+--------------+--------+
|8302 |101 |133 |1027887558032732161|nct🌱 |车美 |M_chemei |3720 |false |
|2552 |73 |218 |2548066344 |null |ひーこ☆禿げても愛せ|heeko_gr_029|15830 |false |
+----------------+---------------+-------------+-------------------+--------+-------------------+------------+--------------+--------+
Extract Tweet Text
Single-column or two columns (text, and full-text) containing Tweet text.
Scala DF
import io.archivesunleashed._
val tweets = "src/test/resources/10-sample.jsonl"
val tweetsDF = spark.read.json(tweets)
text(tweetsDF).show(2, false)
Output:
+---------------------------------+
|text |
+---------------------------------+
|Baket ang pogi mo??? |
|今日すげぇな!#安元江口と夜あそび|
+---------------------------------+
Python DF
from twut import *
path = "src/test/resources/500-sample.jsonl"
df = spark.read.json(path)
SelectTweet.text(df).show(2, False)
Output:
+---------------------------------+
|text |
+---------------------------------+
|Baket ang pogi mo??? |
|今日すげぇな!#安元江口と夜あそび|
+---------------------------------+
Extract Tweet Times
Single-column DataFrame containing the tweet time.
Scala DF
import io.archivesunleashed._
val tweets = "src/test/resources/10-sample.jsonl"
val tweetsDF = spark.read.json(tweets)
times(tweetsDF).show(2, false)
Output:
+------------------------------+
|created_at |
+------------------------------+
|Mon Dec 02 14:16:05 +0000 2019|
|Mon Dec 02 14:16:05 +0000 2019|
+------------------------------+
only showing top 2 rows
Python DF
from twut import *
path = "src/test/resources/500-sample.jsonl"
df = spark.read.json(path)
SelectTweet.times(df).show(2, False)
Output:
+------------------------------+
|created_at |
+------------------------------+
|Mon Dec 02 14:16:05 +0000 2019|
|Mon Dec 02 14:16:05 +0000 2019|
+------------------------------+
Extract Tweet Sources
Single-column DataFrame containing the source of the tweet.
Scala DF
import io.archivesunleashed._
val tweets = "src/test/resources/10-sample.jsonl"
val tweetsDF = spark.read.json(tweets)
sources(tweetsDF).show(10, false)
Output:
+------------------------------------------------------------------------------------+
|source |
+------------------------------------------------------------------------------------+
|Twitter for Android|
|Twitter for Android|
|Twitter for iPhone |
|Twitter for iPhone |
|Twitter for iPhone |
|Twitter Web App |
|Twitter for iPhone |
|Twitter for iPhone |
|Twitter for Android|
|Twitter for iPhone |
+------------------------------------------------------------------------------------+
Python DF
from twut import *
path = "src/test/resources/500-sample.jsonl"
df = spark.read.json(path)
SelectTweet.sources(df).show(10, False)
Output:
+------------------------------------------------------------------------------------+
|source |
+------------------------------------------------------------------------------------+
|Twitter for Android|
|Twitter for Android|
|Twitter for iPhone |
|Twitter for iPhone |
|Twitter for iPhone |
|Twitter Web App |
|Twitter for iPhone |
|Twitter for iPhone |
|Twitter for Android|
|Twitter for iPhone |
+------------------------------------------------------------------------------------+
Extract Hashtags
Single-column DataFrame containg Hashtags.
Scala DF
import io.archivesunleashed._
val tweets = "src/test/resources/10-sample.jsonl"
val tweetsDF = spark.read.json(tweets)
hashtags(tweetsDF).show
Output:
+------------------+
| hashtags|
+------------------+
|安元江口と夜あそび|
+------------------+
Python DF
from twut import *
path = "src/test/resources/500-sample.jsonl"
df = spark.read.json(path)
SelectTweet.hashtags(df).show()
Output:
+------------------+
| hashtags|
+------------------+
|安元江口と夜あそび|
+------------------+
Extract Urls
Single-column DataFrame containing urls.
Scala DF
import io.archivesunleashed._
val tweets = "src/test/resources/10-sample.jsonl"
val tweetsDF = spark.read.json(tweets)
urls(tweetsDF).show(10, false)
Output:
+-----------------------------------------------------------+
|url |
+-----------------------------------------------------------+
|https://t.co/hONLvNozJg |
|https://twitter.com/komsakaddams/status/1198868305668296705|
+-----------------------------------------------------------+
Python DF
from twut import *
path = "src/test/resources/500-sample.jsonl"
df = spark.read.json(path)
SelectTweet.urls(df).show(10, False)
Output:
+-----------------------+
|url |
+-----------------------+
|https://t.co/hONLvNozJg|
|https://t.co/mI5HYXLXwy|
|https://t.co/OLcG6Vu6dI|
|https://t.co/6KANFBbSa2|
|https://t.co/NRKfpoyubk|
|https://t.co/K66y3z4o8U|
|https://t.co/k0k7VndNzw|
|https://t.co/Vf7qICr4v0|
|https://t.co/fqRf3Og2qw|
|https://t.co/kC3XMKWBR8|
+-----------------------+
Extract Animated Gif Urls
Single-column DataFrame containing animated gif urls.
Scala DF
import io.archivesunleashed._
val tweets = "src/test/resources/500-sample.jsonl"
val tweetsDF = spark.read.json(tweets)
animatedGifUrls(tweetsDF).show(10, false)
Output:
+-----------------------------------------------------------+
|animated_gif_url |
+-----------------------------------------------------------+
|https://pbs.twimg.com/tweet_video_thumb/EKyat33U4AEpVFf.jpg|
|https://pbs.twimg.com/tweet_video_thumb/EKyQ1fAU8AM7r1I.jpg|
|https://pbs.twimg.com/tweet_video_thumb/EKyau1OU8AAD_OZ.jpg|
+-----------------------------------------------------------+
Python DF
from twut import *
path = "src/test/resources/500-sample.jsonl"
df = spark.read.json(path)
SelectTweet.animatedGifUrls(df).show(10, False)
Output:
+-----------------------------------------------------------+
|animated_gif_url |
+-----------------------------------------------------------+
|https://pbs.twimg.com/tweet_video_thumb/EKyat33U4AEpVFf.jpg|
|https://pbs.twimg.com/tweet_video_thumb/EKyQ1fAU8AM7r1I.jpg|
|https://pbs.twimg.com/tweet_video_thumb/EKyau1OU8AAD_OZ.jpg|
+-----------------------------------------------------------+
Extract Image Urls
Single-column DataFrame containing image urls.
Scala DF
import io.archivesunleashed._
val tweets = "src/test/resources/500-sample.jsonl"
val tweetsDF = spark.read.json(tweets)
imageUrls(tweetsDF).show(5, false)
Output:
+-----------------------------------------------+
|image_url |
+-----------------------------------------------+
|https://pbs.twimg.com/media/EKjNNRFXsAANHyQ.jpg|
|https://pbs.twimg.com/media/EKvWq8LXsAE_HhV.jpg|
|https://pbs.twimg.com/media/EKx9va5XUAEKcry.jpg|
|https://pbs.twimg.com/media/EKyNK0-WoAMDou3.jpg|
|https://pbs.twimg.com/media/EKyHOyZVUAE3GX6.jpg|
+-----------------------------------------------+
Python DF
from twut import *
path = "src/test/resources/500-sample.jsonl"
df = spark.read.json(path)
SelectTweet.imageUrls(df).show(5, False)
Output:
+-----------------------------------------------+
|image_url |
+-----------------------------------------------+
|https://pbs.twimg.com/media/EKjNNRFXsAANHyQ.jpg|
|https://pbs.twimg.com/media/EKvWq8LXsAE_HhV.jpg|
|https://pbs.twimg.com/media/EKx9va5XUAEKcry.jpg|
|https://pbs.twimg.com/media/EKyNK0-WoAMDou3.jpg|
|https://pbs.twimg.com/media/EKyHOyZVUAE3GX6.jpg|
+-----------------------------------------------+
Extract Media Urls
Single-column DataFrame containing animated gif urls, image urls, and video urls.
Scala DF
import io.archivesunleashed._
val tweets = "src/test/resources/500-sample.jsonl"
val tweetsDF = spark.read.json(tweets)
mediaUrls(tweetsDF).show(5, false)
Output:
+-----------------------------------------------+
|image_url |
+-----------------------------------------------+
|https://pbs.twimg.com/media/EKjNNRFXsAANHyQ.jpg|
|https://pbs.twimg.com/media/EKvWq8LXsAE_HhV.jpg|
|https://pbs.twimg.com/media/EKx9va5XUAEKcry.jpg|
|https://pbs.twimg.com/media/EKyNK0-WoAMDou3.jpg|
|https://pbs.twimg.com/media/EKyHOyZVUAE3GX6.jpg|
+-----------------------------------------------+
Python DF
from twut import *
path = "src/test/resources/500-sample.jsonl"
df = spark.read.json(path)
SelectTweet.mediaUrls(df).show(5, False)
Output:
+-----------------------------------------------+
|image_url |
+-----------------------------------------------+
|https://pbs.twimg.com/media/EKjNNRFXsAANHyQ.jpg|
|https://pbs.twimg.com/media/EKvWq8LXsAE_HhV.jpg|
|https://pbs.twimg.com/media/EKx9va5XUAEKcry.jpg|
|https://pbs.twimg.com/media/EKyNK0-WoAMDou3.jpg|
|https://pbs.twimg.com/media/EKyHOyZVUAE3GX6.jpg|
+-----------------------------------------------+
Extract Video Urls
Single-column DataFrame containing video urls.
Scala DF
import io.archivesunleashed._
val tweets = "src/test/resources/500-sample.jsonl"
val tweetsDF = spark.read.json(tweets)
videoUrls(tweetsDF).show(5, false)
Output:
+---------------------------------------------------------------------------------------------------+
|video_url |
+---------------------------------------------------------------------------------------------------+
|https://video.twimg.com/ext_tw_video/1201113203125583872/pu/pl/mLQJE9rIBSE6DaQ_.m3u8?tag=10 |
|https://video.twimg.com/ext_tw_video/1201113203125583872/pu/vid/460x258/o5wbkNtC_yVBiGvM.mp4?tag=10|
|https://video.twimg.com/ext_tw_video/1200729524045901825/pu/pl/1LRDIgIbWofMDpOa.m3u8?tag=10 |
|https://video.twimg.com/ext_tw_video/1200729524045901825/pu/vid/360x638/KrMl6qgy_8ugHBW-.mp4?tag=10|
|https://video.twimg.com/ext_tw_video/1200729524045901825/pu/vid/320x568/lMOyqZH6fnCoDGzI.mp4?tag=10|
+---------------------------------------------------------------------------------------------------+
Python DF
from twut import *
path = "src/test/resources/500-sample.jsonl"
df = spark.read.json(path)
SelectTweet.videoUrls(df).show(5, False)
Output:
+---------------------------------------------------------------------------------------------------+
|video_url |
+---------------------------------------------------------------------------------------------------+
|https://video.twimg.com/ext_tw_video/1201113203125583872/pu/pl/mLQJE9rIBSE6DaQ_.m3u8?tag=10 |
|https://video.twimg.com/ext_tw_video/1201113203125583872/pu/vid/460x258/o5wbkNtC_yVBiGvM.mp4?tag=10|
|https://video.twimg.com/ext_tw_video/1200729524045901825/pu/pl/1LRDIgIbWofMDpOa.m3u8?tag=10 |
|https://video.twimg.com/ext_tw_video/1200729524045901825/pu/vid/360x638/KrMl6qgy_8ugHBW-.mp4?tag=10|
|https://video.twimg.com/ext_tw_video/1200729524045901825/pu/vid/320x568/lMOyqZH6fnCoDGzI.mp4?tag=10|
+---------------------------------------------------------------------------------------------------+
Remove Sensitive Tweets
Filters outs tweets labeled as sensisitive.
Scala DF
import io.archivesunleashed._
val tweets = "src/test/resources/500-sample.jsonl"
val tweetsDF = spark.read.json(tweets)
removeSensitive(tweetsDF).count
Output:
res0: Long = 246
Python DF
from twut import *
path = "src/test/resources/500-sample.jsonl"
df = spark.read.json(path)
FilterTweet.removeSensitive(df).count()
Output:
246
Remove Retweets
Filters out retweets.
Scala DF
import io.archivesunleashed._
val tweets = "src/test/resources/500-sample.jsonl"
val tweetsDF = spark.read.json(tweets)
removeRetweets(tweetsDF).count
Output:
res0: Long = 230
Python DF
from twut import *
path = "src/test/resources/500-sample.jsonl"
df = spark.read.json(path)
FilterTweet.removeRetweets(df).count()
Output:
230
Remove Non-verified User Tweets
Filters out tweets from non-verified users.
Scala DF
import io.archivesunleashed._
val tweets = "src/test/resources/500-sample.jsonl"
val tweetsDF = spark.read.json(tweets)
removeNonVerified(tweetsDF).count
Output:
res0: Long = 5
Python DF
from twut import *
path = "src/test/resources/500-sample.jsonl"
df = spark.read.json(path)
FilterTweet.removeNonVerified(df).count()
Output:
5
Work with DataFrame Results
Most script snippets in the documentation end with .show(20, false) (in Scala) and .show(20, False) (in Python). This prints a table of results with 20 rows and doesn't truncate the columns (the false or False). You can change the second parameter to true (Scala) or True (Python) if the columns get too wide for better display. If you want more or fewer results, change the first number.
Scala
If you want to return a set of results, the counterpart of .take(10) with RDDs is .head(10).
So, something like (in Scala):
ids(tweetDF)
// more transformations here...
.head(10)
In the Scala console, the results are automatically assigned to a variable, like the following:
res1: Array[org.apache.spark.sql.Row] = Array(...)
Scala automatically numbers the variables, starting at 0, so that the number will increment with each statement.
You can then manipulate the variable, for example res0(0) to access the first element in the array.
Don't like the variable name Scala gives you?
You can do something like this:
val r = ids(tweetDF)
// more transformations here...
.head(10)
Scala assigns the results to r is this case, which you can then subsequently manipulate, like r(0) to access the first element.
If you want all results, replace .take(10) with .collect().
This will return all results to the console.
WARNING: Be careful with .collect()! If your results contain ten million records, TWUT will try to return all of them to your console (on your physical machine).
Most likely, your machine won't have enough memory!
Alternatively, if you want to save the results to disk, replace .show(20, false) with the following:
.write.csv("/path/to/export/directory/")
Replace /path/to/export/directory/ with your desired location.
Note that this is a directory, not a file.
Depending on your intended use of the output, you may want to include headers in the CSV file, in which case:
.write.option("header","true").csv("/path/to/export/directory/")
If you want to store the results with the intention to read the results back later for further processing, then use Parquet format:
.write.parquet("/path/to/export/directory/")
Replace /path/to/export/directory/ with your desired location.
Note that this is a directory, not a file.
Later, as in a completely separate session, you can read the results back in and continuing processing, as follows:
val results = spark.read.parquet("/path/to/export/directory/")
results.show(20, false)
Parquet encodes metadata such as the schema and column types, so you can pick up exactly where you left off.
Note that this works even across languages (e.g., export to Parquet from Scala, read back in Python) or any system that supports Parquet.
Python
If you want to return a set of results, the counterpart of .take(10) with RDDs is .head(10).
So, something like (in Python):
SelectTweet.ids(df)
# more transformations here...
.head(10)
In the PySpark console, the results are returned as a List of rows, like the following:
[Row(id_str='1201505319257403392'), Row(id_str='1201505319282565121'), Row(id_str='1201505319257608197'), Row(id_str='1201505319261655041'), Row(id_str='1201505319261597696'), Row(id_str='1201505319274332165'), Row(id_str='1201505319261745152'), Row(id_str='1201505319270146049'), Row(id_str='1201505319286755328'), Row(id_str='1201505319286984705')]
You can assign the tranformations to a variable, like this:
tweet_ids = SelectTweet.ids(df)
# more transformations here...
.head(10)
If you want all results, replace .head(10) with .collect().
This will return all results to the console.
WARNING: Be careful with .collect()! If your results contain ten million records, TWUT will try to return all of them to your console (on your physical machine).
Most likely, your machine won't have enough memory!
Alternatively, if you want to save the results to disk, replace .show(20, false) with the following:
tweet_ids.write.csv("/path/to/export/directory/")
Replace /path/to/export/directory/ with your desired location.
Note that this is a directory, not a file.
Depending on your intended use of the output, you may want to include headers in the CSV file, in which case:
tweet_ids.write.csv("/path/to/export/directory/", header='true')
If you want to store the results with the intention to read the results back later for further processing, then use Parquet format:
tweet_ids.write.parquet("/path/to/export/directory/")
Replace /path/to/export/directory/ with your desired location.
Note that this is a directory, not a file.
Later, as in a completely separate session, you can read the results back in and continuing processing, as follows:
tweet_ids = spark.read.parquet("/path/to/export/directory/")
tweet_ids.show(20, false)
Parquet encodes metadata such as the schema and column types, so you can pick up exactly where you left off.
Note that this works even across languages (e.g., export to Parquet from Scala, read back in Python) or any system that supports Parquet.
Go
© 2021 GitHub, Inc.
Terms
Privacy
Security
Status
Docs
Contact GitHub
Pricing
API
Training
Blog
About
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session.
You signed out in another tab or window. Reload to refresh your session.